10.支持向量机 SVM

阅读 54

2022-03-11

SVM算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

定义

在这里插入图片描述

超平面最大间隔

在这里插入图片描述

硬间隔和软间隔

硬间隔

在这里插入图片描述

软间隔分类

在这里插入图片描述

算法原理

定义输入数据

在这里插入图片描述

线性可分⽀持向量机

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SVM的计算过程与算法步骤

推导⽬标函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

⽬标函数的求解

在这里插入图片描述

朗格朗⽇乘⼦法

在这里插入图片描述

在这里插入图片描述

对偶问题

在这里插入图片描述
参考资料

在这里插入图片描述
在这里插入图片描述

整体流程确定

在这里插入图片描述
在这里插入图片描述

例子

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
另外一种计算方式

SVM的损失函数

在这里插入图片描述
在这里插入图片描述
最好的是0/1损失,但是难度大,常用Hinge损失,Logistic损失要求太高,容易过拟合

SVM的核⽅法

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

例子一

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

例子二

下⾯这张图位于第⼀、⼆象限内。我们关注红⾊的⻔,以及“北京四合院”这⼏个字和下⾯的紫⾊的字⺟。我们把红⾊的⻔上的点看成是“+”数据,字⺟上的点看成是“-”数据,它们的横、纵坐标是两个特征。 显然,在这个⼆维空间内,“+”“-”两类数据不是线性可分的。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

常见核函数

在这里插入图片描述
在这里插入图片描述

SVM回归

在这里插入图片描述

SVM算法api

在这里插入图片描述

SVC

class sklearn.svm.SVC(C=1.0, kernel='rbf', degree=3,coef0=0.0,random_state=None)

在这里插入图片描述
在这里插入图片描述

NuSVC

class sklearn.svm.NuSVC(nu=0.5)

在这里插入图片描述

LinearSVC

class sklearn.svm.LinearSVC(penalty='l2', loss='squared_hinge', dual=True, C=1.0)

在这里插入图片描述

案例:数字识别器

获取数据

train = pd.read_csv("./data/train.csv")
train.head()
train.shape #(42000, 785)

在这里插入图片描述

确定特征值、目标值

train_image = train.iloc[:,1:]
train_image.head()

在这里插入图片描述

train_label = train.iloc[:,0]
train_label.head()

在这里插入图片描述

# 查看具体图像
def to_plot(n):
    num = train_image.iloc[n,].values.reshape(28,28)
    plt.imshow(num)
    plt.axis("off")
    plt.show()
to_plot(n=3)
   

在这里插入图片描述

数据基本处理

# 对数据特征值归一化处理
train_image = train_image.values / 255
train_image

在这里插入图片描述

train_label = train_label.values
train_label

在这里插入图片描述

# 数据集分割
x_train,x_text,y_train,y_text = train_test_split(train_image,train_label,train_size=0.8,random_state=0)
print(x_train.shape,x_text.shape)

在这里插入图片描述

特征降维和模型训练

import time
from sklearn.decomposition import PCA

# 多次使用pca,确定最后的最优模型
def n_components_analysis(n,x_train,y_train,x_text,y_text):
    start = time.time()
    # PCA 降维
    pca = PCA(n_components=n)
    print("特征降维 n_components:{} ".format(n))
    pca.fit(x_train)
    
    # 在训练集和测试集进行降维
    x_train_pca = pca.transform(x_train)
    x_text_pca = pca.transform(x_text)
    
    # 利用svc进行训练
    print("开始使用svc进行训练")
    
    ss = svm.SVC()
    ss.fit(x_train_pca,y_train)
    
    # 获取accuracy结果
    accuracy = ss.score(x_text_pca,y_text)
    
    end = time.time()
    
    print("准确率是:{},消耗时间是:{}".format(accuracy,int(end-start)))
    
    return accuracy

# 传递多个n_components,寻找合理值
n_s = np.linspace(0.70,0.85,num=5)
accuracy = []
for n in n_s:
    tmp = n_components_analysis(n,x_train,y_train,x_text,y_text)
    accuracy.append(tmp)    

在这里插入图片描述

# 准确率可视化
plt.plot(n_s,np.array(accuracy),"r")
plt.show()

在这里插入图片描述

确定最优模型

pca = PCA(n_components=0.80)
pca.fit(x_train)
pca.n_components_ #43
x_train_pca = pca.transform(x_train)
x_text_pca = pca.transform(x_text)
print(x_train_pca.shape,x_text_pca.shape) #(33600, 43) (8400, 43)
# 训练模型,计算accuracy
ss = svm.SVC()
ss.fit(x_train_pca,y_train)
accuracy = ss.score(x_text_pca,y_text)
accuracy #0.979047619047619

总结

在这里插入图片描述

附录

拉格朗日乘子法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

精彩评论(0)

0 0 举报