svm的代码实现

目录

代码

代码解读

导入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()

代码解读

导入pandas库,并且读取文件
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 函数显示之前绘制的图形。

图片结果为:svm的代码实现_第1张图片

使用SVM进行训练
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 进行训练。
可视化SVM结果
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]# 下超平面方程
可视化原始数据,选取1维核3维的数据进行可视化
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 函数显示之前绘制的图形。

图片结果为:svm的代码实现_第2张图片

你可能感兴趣的:(支持向量机,机器学习,python)