目录
代码
代码解读
导入pandas库,并且读取文件
可视化原始数据
使用SVM进行训练
可视化SVM结果
可视化原始数据,选取1维核3维的数据进行可视化
可视化超平面
进行坐标轴限制
找到支持向量[二维数组]可视化支持向量,并绘制图片
import pandas as pd
data = pd.read_csv('iris.csv', header=None)
import matplotlib.pyplot as plt
data1 = data.iloc[:50, :]
data2 = data.iloc[50:, :]
plt.scatter(data1[1], data1[3], marker='+')
plt.scatter(data2[1], data2[3], marker='o')
plt.show()
from sklearn.svm import SVC
x = data.iloc[:, [1, 3]]
y = data.iloc[:, -1]
svc = SVC(kernel='linear', C=float('inf'), random_state=0)
svc.fit(x, y)
scores = svc.score
print('score: ', scores)
w = svc.coef_[0]
b = svc.intercept_[0]
import numpy as np
x1 = np.linspace(0, 7, 300)
x2 = -(w[0] * x1 + b) / w[1]
x3 = (1 - (w[0] * x1 + b)) / w[1]
x4 = (-1 - (w[0] * x1 + b)) / w[1]
plt.scatter(data1[1], data1[3], marker='+', color='r')
plt.scatter(data2[1], data2[3], marker='o', color='b')
plt.plot(x1, x2, linewidth=2, color='r')
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--')
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--')
plt.xlim(4, 7)
plt.ylim(0, 5)
vets = svc.support_vectors_
plt.scatter(vets[:, 0], vets[:, 1], c='r', marker='x')
plt.show()
import pandas as pd
data = pd.read_csv('iris.csv', header=None)
import matplotlib.pyplot as plt: # 这行代码导入了 matplotlib 库的 pyplot 模块,并将其别名为 plt。
data1 = data.iloc[:50, :]: # 这行代码从 data DataFrame 中选取前 50 行所有列的数据,并将其存储为新的 DataFrame 对象,名为 data1。
data2 = data.iloc[50:, :]: #这行代码从 data DataFrame 中选取第 50 行之后的所有行和所有列的数据,并将其存储为新的 DataFrame 对象,名为 data2。
plt.scatter(data1[1], data1[3], marker='+'): #这行代码使用 matplotlib 的 scatter 函数绘制 data1 DataFrame 中的第 2 列(索引为 1)和第 4 列(索引为 3)的数据点,并使用加号作为标记。
plt.scatter(data2[1], data2[3], marker='o'): #这行代码使用 matplotlib 的 scatter 函数绘制 data2 DataFrame 中的第 2 列(索引为 1)和第 4 列(索引为 3)的数据点,并使用圆圈作为标记。
plt.show(): #这行代码使用 matplotlib 的 show 函数显示之前绘制的图形。
from sklearn.svm import SVC: #这行代码从 sklearn 库中导入了 SVC 类,它是用于支持向量机(Support Vector Machine)的类。
x = data.iloc[:, [1, 3]]: #这行代码从 data DataFrame 中选取所有行的第 2 列和第 4 列的数据,并将其存储为新的 DataFrame 对象,名为 x。
y = data.iloc[:, -1]: #这行代码从 data DataFrame 中选取所有行的最后一列的数据,并将其存储为新的 Series 对象,名为 y。
svc = SVC(kernel='linear', C=float('inf'), random_state=0): #这行代码创建了一个 SVC 对象,名为 svc。其中,kernel 参数设置为 'linear',表示使用线性核函数;C 参数设置为无穷大,表示对分类错误的惩罚非常大;random_state 参数设置为 0,表示随机种子为 0。
svc.fit(x, y): #这行代码使用 SVC 的 fit 函数对 x 和 y 进行训练。
w = svm.coef_[0] # 参数w[原始数据为二维数组]
b = svm.intercept_[0] # 偏置项b[原始数据为一维数组]
# 超平面方程:w1x1+w2x2+b=0
# ->>x2 = -(w1x1+b)/w2
import numpy as np
x1 = np.linspace(0, 7, 300) # 在0~7之间产生300个数据
x2 = -(w[0] * x1 + b) / w[1] # 超平面方程
x3 = (1 - (w[0] * x1 + b)) / w[1] # 上超平面方程
x4 = (-1 - (w[0] * x1 + b)) / w[1]# 下超平面方程
plt.scatter(data1[1], data1[3], marker='+', color='r'): #这行代码使用 matplotlib 的 scatter 函数绘制 data1 DataFrame 中的第 2 列(索引为 1)和第 4 列(索引为 3)的数据点,并使用红色作为标记。
plt.scatter(data2[1], data2[3], marker='o', color='b'): #这行代码使用 matplotlib 的 scatter 函数绘制 data2 DataFrame 中的第 2 列(索引为 1)和第 4 列(索引为 3)的数据点,并使用蓝色作为标记
plt.plot(x1, x2, linewidth=2, color='r'): #这行代码使用 matplotlib 的 plot 函数绘制从 x1 到 x2 的直线,并设置线条宽度为2,并使用红色作为线条颜色。
plt.plot(x1, x3, linewidth=1, color='r', linestyle='--'): #这行代码使用 matplotlib 的 plot 函数绘制从 x1 到 x3 的直线,并设置线条宽度为1,使用红色作为线条颜色,并使用虚线作为线条样式。
plt.plot(x1, x4, linewidth=1, color='r', linestyle='--'): #这行代码使用 matplotlib 的 plot 函数绘制从 x1 到 x4 的直线,并设置线条宽度为1,使用红色作为线条颜色,并使用虚线作为线条样式。
plt.xlim(4, 7): #这行代码设置 x 轴的显示范围为 4 到 7。
plt.ylim(0, 5): #这行代码设置 y 轴的显示范围为 0 到 5。
vets = svc.support_vectors_: #这行代码获取 svc 对象中支持向量的数据,并将其存储在变量 vets 中。
plt.scatter(vets[:, 0], vets[:, 1], c='r', marker='x'): #这行代码使用 matplotlib 的 scatter 函数绘制 vets DataFrame 中的第一列和第二列的数据点,并使用红色作为标记和线条颜色。
plt.show(): #这行代码使用 matplotlib 的 show 函数显示之前绘制的图形。