用python实现已知正例点x1=(1,2)T,x2=(2,3)T,x3=(3,3)T,负例点x4=(2,1)T,x5=(3,2)T,试求最大间隔分离超平面和分类决策函数,并在图上画出分离超平面,间隔边界及支持向量,以代码形式呈现
时间: 2024-10-12 18:04:41 浏览: 150
在Python中,我们可以使用SVM(支持向量机)库如Scikit-Learn来实现线性最大间隔超平面。首先,我们需要导入必要的库并定义数据集:
```python
import numpy as np
from sklearn import svm
import matplotlib.pyplot as plt
# 定义数据
X = np.array([[1, 2], [2, 3], [3, 3], [2, 1], [3, 2]])
y = np.array([1, 1, 1, -1, -1]) # 标签,正例为1,负例为-1
# 创建线性SVM模型
clf = svm.LinearSVC()
# 训练模型
clf.fit(X, y)
# 计算支持向量
support_vectors = X[clf.support_]
# 分类决策函数(w * x + b = 0)
w = clf.coef_[0]
b = -clf.intercept_[0]
def decision_function(x):
return w[0] * x[0] + w[1] * x[1] + b
# 计算最大间隔
max_margin = abs(w.dot(support_vectors.mean(axis=0)))
# 画图
plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='viridis')
plt.plot([min(X[:, 0]), max(X[:, 0])], [-w[0]*min(X[:, 1])-b, -w[0]*max(X[:, 1])-b], 'k-', linewidth=2)
plt.plot([min(X[:, 0]), max(X[:, 0])], [w[0]*min(X[:, 1])+b, w[0]*max(X[:, 1])+b], 'k:', linewidth=2)
plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100, facecolors='none', edgecolors='r') # 绘制支持向量
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title(f"Max Margin SVM: margin={max_margin:.2f}")
plt.grid(True)
plt.show()
```
这个代码将创建一个线性SVM模型并训练它,然后计算支持向量、分类决策函数以及最大间隔。最后,它会在图形上展示数据点、间隔边界和支持向量。
阅读全文