机器学习(二):感知机+svm习题 感知机手工推导参数更新 svm手推求解二维坐标超平面直线方程

2023-04-25,,

作业1:

输入: 训练数据集 \(T = {(x1; y1); (x2; y2),..., (xN; yN)}\) 其中,\(x \in R^n\), \(y \in Y = \{+1, -1\}\), \(i=1,2...,N\),学习率\(η = 0.1\).

输出: \(w\),\(b\) ; 感知机模型\(f(x) = sign(w · x + b)\)

给出下列训练数据的感知机参数学习过程:

\(x_1\) \(x_2\) \(y\)
-3.0 3.0 1
-5.0 2.0 1
2.0 4.0 -1
3.0 2.0 -1

解:

step1: 令初值 \(w_o=[0,0]^T,b_0=0\)

step2: 选取第一个点 \((x_1,y_1)=([-3,3]^T,1)\)

step3: 计算 \(y_i(w_i\cdot x_i+b)=1\times (0+0)=0\le 0\) 那么进行迭代

\(w \leftarrow w+\eta y_{i} x_{i}\) 即 \(w_1=[0,0]^T+0.1\times 1\times [-3,3]^T=[-0.3,0.3]^T\)

\(b \leftarrow b+\eta y_{i}\) 即 \(b_1=0+0.1\times 1=0.1\)

step4: 【回到第二步验证第三步分类结果并迭代直到没有误分类】感知机算法是收敛的,不会无限更新参数

再次计算可知对于第一个点\(y_1(w_1 \cdot [x_{11},x_{12}]^T+b)=1 \times (-0.3 \times -3+0.3 \times 3+0.1)=1.9>0\)

​ 对于第二个点:\(1\times (1.5+0.6+0.1)=2.2>0\)

​ 对于第三个点:\(-1\times (-0.6+1.2+0.1)=-0.7<0\)

​ 进行迭代\(w_2=[-0.3-0.1\times2,0.3-0.1\times 4]^T=[-0.5,-0.1]^T\)

​ \(b_2=0.1+0.1=0.2\)

​ 对于第一个点:\(y_1(w_1\cdot x_1+b_1)=1.2>0\)

​ 对于第二个点:\(y_2(w_2\cdot x_2+b_2)=2.3>0\)

​ 对于第三个点:\(y_3(w_3\cdot x_3+b_3)=1.4>0\)

​ 对于第四个点:\(y_4(w_4\cdot x_4+b_4)=1.7>0\)

​ 没有误分类,迭代结束.

2.根据数据样本点,按照SVM算法计算分类超平面方程

\(x_1\) \(x_2\) \(y\)
-3.0 3.0 1
-5.0 2.0 1
2.0 4.0 -1
3.0 2.0 -1

解:

step1:将散点图绘制在坐标轴上,并找出支持向量,对应的支持向量(点)是(-3,3)和(2,4)

step2:计算样本点(-3,3)和(2,4)到分类超平面的距离,即点到直线的距离。

有了两个支持向量,你就可以确定分类超平面了。超平面在二维空间中是一条直线,其方程可以用以下公式表示:

\[w_1 x_1 + w_2 x_2 + b = 0
\]

其中,\(x_1\) 和 \(x_2\) 分别代表坐标轴上的两个维度,\(w_1\) 和 \(w_2\) 是法向量 \(w\) 在两个维度上的分量,\(b\) 是偏移量。而法向量 \(w\) 可以根据两个支持向量 \(\vec{x_1}\) 和 \(\vec{x_2}\) 计算得到。具体地,\(w\) 可以表示为:

\[w = [(y_2 - y_1), -(x_2 - x_1)]=[1,-5]
\]

偏移量 \(b\) 可以由其中任意一个支持向量 \(\vec{x_i}\) 计算得到,公式如下:

\[b = - w^{T} \cdot \vec{x_{mid}}^T=-[1,-5]^T[-0.5,3.5]^T=18
\]

将 \(w_1\),\(w_2\) 和 \(b\) 代入超平面方程即可得到分类超平面的直线方程\(x_1-5x_2+18=0\)

?这个计算方法是错的,应当采用拉格朗日+KKT或者用对偶问题求解

附录:

绘制散点图的代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm # 坐标点数据
X = np.array([[-3, 3], [-5, 2], [2, 4], [3, 2]])
y = np.array([1, 1, -1, -1]) # 定义SVM分类器
clf = svm.SVC(kernel='linear')
clf.fit(X, y) # 定义SVM超平面
w = clf.coef_[0]
b = clf.intercept_
x1 = np.arange(-6, 6)
x2 = -(w[0] * x1 + b) / w[1] # 创建一个散点图
fig, ax = plt.subplots() # 设置坐标轴范围和中心点
x_min, x_max = -6, 6
y_min, y_max = -6, 6
ax.set_xlim(x_min, x_max)
ax.set_ylim(y_min, y_max)
ax.spines['left'].set_position('center')
ax.spines['bottom'].set_position('center')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none') # 绘制四个点
ax.scatter(X[0, 0], X[0, 1], color='r')
ax.scatter(X[1, 0], X[1, 1], color='r')
ax.scatter(X[2, 0], X[2, 1], color='b')
ax.scatter(X[3, 0], X[3, 1], color='b') # 绘制SVM超平面
ax.plot(x1, x2, c='r',label='svm') # 在散点周围添加坐标注释
ax.annotate(f'({X[0, 0]}, {X[0, 1]})', xy=(X[0, 0], X[0, 1]), xytext=(5, 5), textcoords='offset points')
ax.annotate(f'({X[1, 0]}, {X[1, 1]})', xy=(X[1, 0], X[1, 1]), xytext=(5, 5), textcoords='offset points')
ax.annotate(f'({X[2, 0]}, {X[2, 1]})', xy=(X[2, 0], X[2, 1]), xytext=(5, 5), textcoords='offset points')
ax.annotate(f'({X[3, 0]}, {X[3, 1]})', xy=(X[3, 0], X[3, 1]), xytext=(5, 5), textcoords='offset points') # 增加图例 显示图像
plt.legend(loc='best')
plt.show()

机器学习(二):感知机+svm习题 感知机手工推导参数更新 svm手推求解二维坐标超平面直线方程的相关教程结束。

《机器学习(二):感知机+svm习题 感知机手工推导参数更新 svm手推求解二维坐标超平面直线方程.doc》

下载本文的Word格式文档,以方便收藏与打印。