内容来自:https://github.com/GreedyAIAcademy/Machine-Learning

最初

支持向量机的目的:找到一条好的分割线
什么杨的分割线最好?
有最大间隔的分割线最好。
机器学习笔记4:SVM支持向量积的推导过程

推导过程

机器学习笔记4:SVM支持向量积的推导过程

Support Vector是被选中用于计算的点,也就是距离分界线最近的几个点。

显然d1+d2=“向量(x1-x2)的模”*cosθ。
根据向量内机的算法:向量w*向量(x1-x2)=|w|*|x1-x2|cosθ
因此,d1+d2=向量w*向量(x1-x2)/|w|,又根据上面的两个方程式相加就可以知道d1+d2=2/|w|

又因为向量w向量w的转置矩阵=|w|的平方
所以为了让(d1+d2)最大,也就是让"向量w
向量w的转置矩阵"最小,然后再加上一个松弛变量就有了这样的方程:
机器学习笔记4:SVM支持向量积的推导过程

实际生活中如果考虑全部的点很有可能画不出分割线,松弛变量的意思就是舍弃一些点画出分割线:
机器学习笔记4:SVM支持向量积的推导过程

最终的向量内积方程的形式是:
机器学习笔记4:SVM支持向量积的推导过程

扩展SVM到支持多个类别

两种方法:

  1. OVR (one versus rest): 对于K个类别的情况, 训练K个SVM, 第 j 个SVM用于判读任意条数据是属于类别 j 还是属于类别非 j. 预测的时候, 具有最大值的 ????_i^???? ???? 表示给定的数据 x 属于类别 i.
  2. OVO (one versus one), 对于K个类别的情况, 训练K * (K-1) /2 个SVM, 每一个SVM只用于判读任意条数据是属于K中的特定两个类别. 预测的时候, 使用K * (K-1) /2 个SVM做 K * (K-1) /2 次预测, 使用计票的方式决定数据被分类为哪个类别的次数最多, 就认为数据 x 属于此类别.
    机器学习笔记4:SVM支持向量积的推导过程

一些函数参考

make_blobs():https://www.cnblogs.com/peixu/p/8011656.html
gridSearchCV(): https://blog.csdn.net/weixin_41988628/article/details/83098130
分类评估:https://blog.csdn.net/u012429555/article/details/82973387
协方差的意义:https://blog.csdn.net/GoodShot/article/details/79940438
PCA降维参数:https://www.cnblogs.com/akrusher/articles/6442549.html
scatter:https://matplotlib.org/api/_as_gen/matplotlib.pyplot.scatter.html

课后练习

#引入包
from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.pipeline import make_pipeline

# PCA数据降维和SVC初始化
# make_pipeline建立管道,让pca的输出作为svc的输入
pca = PCA(n_components=117, whiten=True, random_state=42)
svc = SVC(kernel='linear', class_weight='balanced')
model = make_pipeline(pca, svc)

# 将数据分为训练数据和测试数据
from sklearn.model_selection import train_test_split
Xtrain, Xtest, ytrain, ytest = train_test_split(X_mush, y_mush, random_state=41)

#调参:通过交叉验证寻找最佳的 C (控制间隔的大小)							
from sklearn.model_selection import GridSearchCV
param_grid = {'svc__C': [1, 5, 10, 50]}
grid = GridSearchCV(model, param_grid)
%time grid.fit(Xtrain, ytrain)
print(grid.best_params_)

# 用训练好的SVM做预测	
model = grid.best_estimator_
yfit = model.predict(Xtest)

# 生成报告
from sklearn.metrics import classification_report
print(classification_report(ytest, yfit, target_names=["p","e"]))

结果和PCA降维有关,n_components=117、50时都是1,n_components=8时的结果如下:

              precision    recall  f1-score   support

           p       0.94      0.96      0.95      1047
           e       0.96      0.94      0.95       984

   micro avg       0.95      0.95      0.95      2031
   macro avg       0.95      0.95      0.95      2031
weighted avg       0.95      0.95      0.95      2031

分类评估的字段解析

定义

TP、True Positive:预测为正,实际也为正
FP、False Positive:预测为正,实际为负
FN、False Negative:预测与负、实际为正
TN、True Negative:预测为负、实际也为负。

precision=TP/(TP+FP)
recall=TP/(TP+FN)
f1-score=2precisionrecall/(precision+recall)

宏平均:算数平均值
微平均:Micro-average=(TP+FP)/(TP+TN+FP+FN)
加权平均:weighted avg
support: 支持每个类别的用例数

图文举例说明

示例报告内容如下:
机器学习笔记4:SVM支持向量积的推导过程

示例的结果矩阵如下:
机器学习笔记4:SVM支持向量积的推导过程

解释

如图,这是一份人脸识别的报告,每个标签都代表一个人:
对角线是TP:表示预测图片是这个人,实际也是这个人;
除去对角线上的数据后:
整行看是FP:表示你预测是这个人,实际是别人;
整列看是FN:表示你预测不是这个人,实际是这个人;
针对每个label,除去上面涉及的数据,剩下的就是TN,即预测和结果都不是这个人