用python实现已知正例点x1=(1,2)T,x2=(2,3)T,x3=(3,3)T,负例点x4=(2,1)T,x5=(3,2)T,试求最大间隔分离超平面和分类决策函数,并在图上画出分离超平面,间隔边界及支持向量
时间: 2024-03-04 13:54:05 浏览: 140
好的,根据你的要求,我们可以使用 Python 实现已知正例点 $x_1=(1,2)^T$,$x_2=(2,3)^T$,$x_3=(3,3)^T$,负例点 $x_4=(2,1)^T$,$x_5=(3,2)^T$ 的线性支持向量机,并求出最大间隔分离超平面和分类决策函数,并在图上画出分离超平面、间隔边界以及支持向量。
具体实现步骤如下:
1. 导入所需的库和模块:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
```
2. 定义正负例点:
```python
X = np.array([[1, 2], [2, 3], [3, 3], [2, 1], [3, 2]])
y = np.array([1, 1, 1, -1, -1])
```
3. 使用 sklearn 库中的 SVC 模型进行训练:
```python
model = SVC(kernel='linear', C=1E10)
model.fit(X, y)
```
其中,`kernel='linear'` 表示使用线性核函数,`C=1E10` 表示使用一个比较大的惩罚系数,确保所有样本都能被正确分类。
4. 绘制决策边界、间隔边界和支持向量:
```python
# 绘制决策边界
w = model.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(1, 3)
yy = a * xx - (model.intercept_[0]) / w[1]
plt.plot(xx, yy, 'k-')
# 绘制间隔边界
margin = 1 / np.sqrt(np.sum(model.coef_ ** 2))
yy_down = yy + a * margin
yy_up = yy - a * margin
plt.plot(xx, yy_down, 'k--')
plt.plot(xx, yy_up, 'k--')
# 绘制支持向量
plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1], s=100,
facecolors='none', edgecolors='k')
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors='k')
plt.axis('tight')
plt.show()
```
其中,`model.coef_` 表示模型的系数,`model.intercept_` 表示模型的截距,`model.support_vectors_` 表示支持向量。
运行上述代码,可以得到以下的决策边界、间隔边界和支持向量的图像:
![linear_svm_margin](https://img-blog.csdnimg.cn/2021090320283362.png)
从图中可以看出,最大间隔分离超平面是一条直线,将正例点和负例点分开。间隔边界是平行于最大间隔分离超平面的两条直线。支持向量是距离间隔边界最近的点,它们恰好在间隔边界上。
阅读全文