机器学习——支持向量机

2020-01-19 15:59:04 浏览数 (2)

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
svm

0 人点赞