SVM处理非线性问题

1、什么是核函数

首先我们回顾一下多项式方法。对样本数据进行多项式转换并不是真正的增加了样本数据的特征数量,而且对原有的特征数据进行转换,构造出其他特征,这些新构造出的特征和原始特征都有强关联。

比如如果将原本只有x1x1、x2x2两个特征的样本数据通过多项式转换为有10个特征的数据,那么转换后的这10个特征分别为:1,x1x1,x2x2,x21x12,x22x22,x1x2x1x2,x31x13,x32x23,x21x2x12x2,x1x22x1x22。

假设某个机器学习算法的原始公式中含有xixjxixj(xixi和xjxj为特征向量),如果是使用多项式的方法,那么首先需要将xixi和xjxj转换为x′ixi′和x′jxj′,然后转换后的,具有10个元素的两个新特征向量再相乘。如果转换后的特征数量比较多的时候,新特征向量的计算复杂度就会变的很高,并且还需要占用大量内存在存储庞大的特征向量。

那么核函数就是要解决上面的问题。所以多项式核函数就是有这样一个函数,将xixi和xjxj作为参数传入,再指定要构造的特征数,然后该函数直接返回x′ix′jxi′xj′的值。该函数既可以模拟多项式构造特征的原理,又能将新特征向量的点乘计算出来,同时计算复杂度相对比较小,而且也不用存储庞大的新特征向量。

2、用SVM算法使用特征多项式处理非线性样本

#!/usr/bin/python
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
from sklearn import datasets
import pandas as pd
import numpy as np
x,y = datasets.make_moons()
print(x.shape)
print(y.shape)
plt.scatter(x[y==0,0],x[y==0,1],color="red")
plt.scatter(x[y==1,0],x[y==1,1],color="blue")
plt.show()
#为数据添加随机的噪音
x,y = datasets.make_moons(noise=0.15,random_state=666)
plt.scatter(x[y==0,0],x[y==0,1],color="red")
plt.scatter(x[y==1,0],x[y==1,1],color="blue")
plt.show()
#用SVM算法使用多项式特征的方法处理不规则的数据集
from sklearn.preprocessing import PolynomialFeatures,StandardScaler
#from  sklearn.svm import LinearSVC
#由于上面的几步都需要顺序的执行,因此引入pipline函数
from sklearn.pipeline import Pipeline
def plot_decision_boundary(model, axis):
	# meshgrid函数用两个坐标轴上的点在平面上画格,返回坐标矩阵
	X0, X1 = np.meshgrid(
		# 随机两组数,起始值和密度由坐标轴的起始值决定
		np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
		np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),
	)
	# ravel()方法将高维数组降为一维数组,c_[]将两个数组以列的形式拼接起来,形成矩阵
	X_grid_matrix = np.c_[X0.ravel(), X1.ravel()]
	
	# 通过训练好的逻辑回归模型,预测平面上这些点的分类
	y_predict = model.predict(X_grid_matrix)
	y_predict_matrix = y_predict.reshape(X0.shape)
	
	# 设置色彩表
	from matplotlib.colors import ListedColormap
	my_colormap = ListedColormap(['#0000CD', '#40E0D0', '#FFFF00'])
	
	# 绘制等高线,并且填充等高区域的颜色
	plt.contourf(X0, X1, y_predict_matrix, linewidth=5, cmap=my_colormap)

plot_decision_boundary(poly_svc,axis=[-1.5,2.5,-1.0,1.5])
plt.scatter(x[y == 0, 0], x[y == 0, 1], color="red")
plt.scatter(x[y == 1, 0], x[y == 1, 1], color="blue")
plt.show()

猜你喜欢

转载自blog.csdn.net/ITpfzl/article/details/82829889