一、python中支持向量机(SVM)的用法
在官网的识别手写数字的实例中:
classifier = svm.SVC(gamma=0.001)
X_train, X_test, y_train, y_test = train_test_split(
data, digits.target, test_size=0.5, shuffle=False)
classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)
1.首先构建一个分类器classifier。svm.SVC:分类的方式是支持向量机器(SVM)中的 Support Vector Classification(SVC)支持向量分类。也就是说这里的svm用来做分类处理而不是回归(预测一个连续值)。gamma的值与后面用高斯核函数时的sigma值是有关系的:gamma = 1 / (sigma)^2
2.train_test_split 函数用来将数据集分成训练集和测试集,test_size=0.5 表示按五五开的比列划分,shuffle=False表示在划分之前不将数据随机重组。
3.classifier.predict(X_test) 表示预测测试集X_test中的结果。
在使用之前调用的包:
from sklearn.svm import SVC
from sklearn import svm
二、python实现
1.数据可视化、使用SVM做分类处理
path = r'ex6data1.mat'
data1 = scio.loadmat(path)
X = data1['X']
y = data1['y']
#数据可视化data1
plot_data(X, y)
#svm线性模型
clf = svm.SVC(C=1, kernel='linear')
clf.fit(X, y.flatten())
visualize_boundary(X, y, clf, 0, 5, 1.5, 5)
#高斯核
x1 = [1, 2, 1]
x2 = [0, 4, -1]
sigma = 2
sim = guassian_kernel(x1, x2, sigma)
原始数据:
上面用到的界限划分函数 visualize_boundary :
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from plotData import plot_data
def visualize_boundary(x, y, clf, xmin, xmax, ymin, ymax):
#散点图
plot_data(x, y)
#分界线
xx, yy = np.meshgrid(np.arange(xmin, xmax, .02), np.arange(ymin, ymax, .02))
z = clf.predict(np.c_[xx.flatten(), yy.flatten()])
z = z.reshape(xx.shape)
plt.contour(xx, yy, z, levels=[0])
plt.show()
设置惩罚参数C,C越大越使划分强行考虑到所有的点:
C = 100,强制让所有的分类正确。
C = 1,异常点的分类是不正确的,但是划分符合实际情况。
2 .非线性边界的划分
1.数据可视化(例子一)
path = r'ex6data2.mat'
data2 = scio.loadmat(path)
X = data2['X']
y = data2['y']
plot_data(X, y)
plt.show()
#svm高斯模型
clf = svm.SVC(C=100, kernel='rbf')
clf.fit(X, y.flatten())
visualize_boundary(X, y, clf, 0, 1, 0.4, 1)
原始数据:
高斯核处理非线性分类后:
2.数据可视化(例子二)
path = r'ex6data3.mat'
data3 = scio.loadmat(path)
X = data3['X']
y = data3['y']
Xval = data3['Xval']
yval = data3['yval']
plot_data(X, y)
plt.show()
#svm高斯模型
clf = svm.SVC(C=100, kernel='rbf')
clf.fit(X, y.flatten())
visualize_boundary(X, y, clf, -0.6, 0.3, -0.8, 0.6)
划分结果(C = 100)
选择最佳C,sigma:
C, sigma, corr = choice_best_para(X, y, Xval, yval)
选择函数:
import numpy as np
from predict import predict
from sklearn import svm
def choice_best_para(x, y, xval, yval):
C = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
sigma = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
C_best = 0
sigma_best = 0
corr_rate_best = 0
for i in range(9):
for j in range(9):
clf = svm.SVC(C=C[i], kernel='rbf', gamma=1/(np.power(sigma[j], 2)*2))
clf.fit(x, y.flatten())
y_pred = clf.predict(xval)
corr_rate = predict(y_pred, yval)
if corr_rate > corr_rate_best:
corr_rate_best = corr_rate
C_best = C[i]
sigma_best = sigma[j]
return C_best, sigma_best, corr_rate_best
predict 函数:
import numpy as np
def predict(y_pred, yval):
yval = yval.flatten()
corr_rate = np.mean(np.where(y_pred == yval, 1, 0))
return corr_rate
结果:
三、垃圾邮件的识别
预处理函数暂时写不出来,有时间再补上。。。。。。