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
总结
附录
拉格朗日乘子法