# -*— coding:utf-8 -*-
# Author:Jun Huang
#导入相关的方法
import matplotlib.pyplot as plt
import numpy as np
from sklearn import svm
def loadDataSet(fileName):
"""
对文件进行逐行解析,从而得到第行的类标签和整个数据矩阵
Args:
fileName 文件名
Returns:
dataMat 数据矩阵
labelMat 类标签
"""
dataMat = []
labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr = line.strip().split(',')
dataMat.append([float(lineArr[0]), float(lineArr[1])])
labelMat.append(float(lineArr[2]))
return dataMat, labelMat
X, Y = loadDataSet('testSet.txt')
X = np.mat(X) # 将二维数组转化为矩阵
#可视化数据集
print("X=", X[:5])
print("Y=", Y[:5])
# 拟合一个SVM模型
"""
C越大 惩罚越大,越容易过拟合
grid search
"""
#训练模型
clf = svm.SVC(C=5,kernel='linear',gamma=10)
clf.fit(X, Y)
# 获取分割超平面
w = clf.coef_[0] # 获取超平面
# 斜率
a = -w[0] / w[1]
# 从-2到10,顺序间隔采样50个样本,默认是num=50
xx = np.linspace(-2, 10) # , num=50)
# 二维的直线方程
yy = a * xx - (clf.intercept_[0]) / w[1] # clf.intercept_[0]截距
print("yy=", yy)
# plot the parallels to the separating hyperplane that pass through the support vectors
# 通过支持向量绘制分割超平面
print("support_vectors_=", clf.support_vectors_)
b = clf.support_vectors_[0]
# 输出支持向量
# b1 = a*b0 + b ---> b = b1 - a*b0
yy_down = a * xx + (b[1] - a * b[0])
b = clf.support_vectors_[-1]
yy_up = a * xx + (b[1] - a * b[0])
#可视化
# 画出直线,散点以及临界点的支持向量平面
plt.plot(xx, yy, 'k-')
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1], s=80, facecolors='none')
plt.scatter(X[:, 0].flat, X[:, 1].flat, c=Y, cmap=plt.cm.Paired)
plt.axis('tight')
plt.show()
SVM案例(附代码)
最新推荐文章于 2024-04-22 00:13:14 发布