SVM就是试图把棍放在一堆球中的最佳位置,好让在棍的两边有尽可能大的间隙。这个间隙就是球到棍的距离。
- 支持向量机:找到分类界面,使支持向量间的间隔最大,支持向量到分割界面的距离最小
- 支持向量是通过到分割界面距离最小的点的向量,且两向量间的距离最大,在二维中其实就是点
- 取支持向量间的最大间隔是为了若当再添加一个点到一类中,最大间隔可以容许,仍然可以进行有效分割
- 支持向量到分割界面(决策面)距离最小意思是这些点最为接近
导入类库
代码语言:javascript复制1 from sklearn.datasets import load_digits
2 from sklearn.metrics import classification_report
3 from sklearn.model_selection import train_test_split
4 from sklearn.preprocessing import StandardScaler
5 from sklearn.svm import LinearSVC
6 import numpy as np
7 import matplotlib.pyplot as plt
代码
代码语言:javascript复制 1 def hw_recognition():
2 digits = load_digits()
3
4 X_train, X_test, Y_train, Y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=23)
5
6 ss = StandardScaler()
7 # fit 是实例方法,必须由实例调用
8 X_train = ss.fit_transform(X_train)
9 X_test = ss.transform(X_test)
10
11 lsvc = LinearSVC()
12 lsvc.fit(X_train, Y_train)
13
14 # 预测测试集数据
15 # Y_predict = lsvc.predict(np.array([X_test[90]]))
16 # print(Y_predict)
17
18 # 生成评估报告
19 # 精确率precision = 正正 / (正正 反正)
20 # 按列计算
21 #
22 # 召回率recall = 正正 / (正正 正反)
23 # 按行计算
24 # 按行解释正反:正正-真正的正例预测为正例;正反-真正的正例预测为反例
25 # 反正-真正的反例预测为正例;反正-真正的反例预测为正例
26 Y_predict = lsvc.predict(X_test)
27 print(classification_report(Y_test, Y_predict, target_names=digits.target_names.astype(str)))
28
29 # 对比预测的数字与原图像中的数字
30 # Y_predict = lsvc.predict(np.array([digits.data[307]]))
31 # plt.imshow(digits.images[307])
32 # print(Y_predict)
33 # plt.show()
解析
代码语言:javascript复制 1 真实数据 预测数据
2 ---------------------------
3 18正 12反
4 20正 12正正 8正反
5 10反 6反正 4反反
6 ---------------------------
7
8 精确率precision = 正正/(正正 反正) 按列计算
9
10 召回率recall = 正正/(正正 正反) 按行计算
运行结果
代码语言:javascript复制精确率 召回率
precision recall f1-score support
0 1.00 1.00 1.00 37
1 0.86 0.90 0.88 48
2 1.00 0.98 0.99 46
3 0.91 0.98 0.94 41
4 1.00 0.96 0.98 49
5 0.91 0.98 0.94 50
6 0.98 0.98 0.98 41
7 0.92 0.95 0.93 37
8 0.93 0.89 0.91 46
9 1.00 0.91 0.95 55
avg / total 0.95 0.95 0.95 450