已知正例点x1=(1,2),x2=(2,3)T,x3=(3, 3)T,负例 点x4 = (2, 1) [,x5 = (3, 2)T, 试用 sklearn的svc函数求最大 间隔分离超平面和分类决策函数,并在图上画出散点图、 分离超平面、间隔边界及支持向量。
时间: 2024-12-10 14:49:30 浏览: 101
为了使用scikit-learn (sklearn) 的 `SVC` 函数(支持向量机)求解这个问题,你需要按照以下步骤操作:
1. **导入库**:
首先,你需要导入必要的库,包括`numpy`用于处理数值计算,以及`sckit-learn`库中的` SVC` 和绘图工具。
```python
import numpy as np
from sklearn import svm
import matplotlib.pyplot as plt
```
2. **数据准备**:
定义输入特征矩阵(X)和目标标签向量(y)。在这种情况下,你可以创建一个二维数组,每一行代表一个点,最后一列是标签(1表示正例,-1表示负例)。
```python
X = np.array([[1, 2], [2, 3], [3, 3], [2, 1], [3, 2]])
y = np.array([1, 1, 1, -1, -1])
```
3. **模型训练**:
使用`SVC`函数创建一个线性核的支持向量机模型,并拟合数据。
```python
clf = svm.SVC(kernel='linear', C=1) # 线性核,C值通常设为1(如果未指定,默认)
clf.fit(X, y)
```
4. **获取间隔**:
虽然`SVC`本身不会直接提供间隔信息,但我们可以通过理解它的工作原理来得知最大间隔。在二分类问题中,间隔等于软间隔惩罚参数`C`的倒数,因为较大的C会限制间隔大小以减少误分类点的数量。
5. **绘制结果**:
使用matplotlib画出散点图和决策边界。首先,我们需要找到支持向量(也就是决策边界上的点),这通常是通过`decision_function`函数获得。
```python
# 计算决策函数并找出支持向量
support_vectors = X[clf.support_]
decision_values = clf.decision_function(X)
# 绘制散点图
plt.scatter(X[:, 0], X[:, 1], c=y, s=80, cmap='viridis')
plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=200, facecolors='none', edgecolors='red')
# 创建网格并预测分类
xx, yy = np.meshgrid(np.linspace(0, 4, 100), np.linspace(0, 4, 100))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界
contour = plt.contourf(xx, yy, Z, alpha=0.3)
plt.show()
```
在这个例子中,我们假设间隔边界是一条直线。注意,实际的间隔计算可能会更复杂,尤其是在非线性核函数下。上述代码仅适用于线性核的情况。
阅读全文