我们有一个名为ex6data1.mat
的数据文件,它采用MATLAB的格式,但Python同样支持读取这种格式的数据。我们可以通过以下方式来读取和处理这个文件:
```python import scipy.io as sio
mat = sio.loadmat('ex6data1.mat') print(mat.keys())
data = pd.DataFrame(mat.get('X'), columns=['X1', 'X2']) data['y'] = mat.get('y') ```
通过以上步骤,我们得到了两个关键变量:X
和y
。X
代表样本数据,而y
代表样本标签。接下来,我们将数据转换为Pandas DataFrame格式以便于处理。
在开始训练模型之前,我们首先绘制原始数据的分布情况,以便更好地理解数据的结构。代码如下:
```python import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(8, 6)) ax.scatter(data['X1'], data['X2'], s=50, c=data['y'], cmap='Reds') ax.settitle('Raw Data') ax.setxlabel('X1') ax.set_ylabel('X2') plt.show() ```
从图中可以看到,数据基本呈现线性可分的状态,因此我们可以直接使用线性核函数进行训练。以下是训练SVM模型的代码:
```python from sklearn import svm
svc1 = svm.SVC(C=10, kernel='linear') svc1.fit(data[['X1', 'X2']], data['y'])
accuracy = svc1.score(data[['X1', 'X2']], data['y']) print("Training Accuracy: ", accuracy) ```
模型的训练准确率为98.04%,说明模型对训练数据具有较高的拟合能力。
接下来,我们利用决策函数值来进一步分析每个样本的分类置信度。代码如下:
```python
data['SVM1 Confidence'] = svc1.decision_function(data[['X1', 'X2']])
fig, ax = plt.subplots(figsize=(8, 6)) ax.scatter(data['X1'], data['X2'], s=50, c=data['SVM1 Confidence'], cmap='RdBu') ax.set_title('SVM (C=1) Decision Confidence') plt.show() ```
通过上图,我们可以直观地看到每个样本的分类置信度,有助于进一步优化模型参数。
最后,我们绘制分割超平面和支持向量所在的支持超平面。代码如下:
```python import numpy as np
w = svc1.coef[0] b = svc1.intercept[0] w1 = w[0] w2 = w[1] x1 = np.linspace(-5, 5)
x2 = -w1 / w2 * x1 - b / w2 plt.plot(x1, x2, 'k-', label='Decision Boundary')
supportvectors = svc1.supportvectors_ yydown = -(w1 / w2) * x1 + (supportvectors[0][1] - w1 / w2 * supportvectors[0][0]) yyup = -(w1 / w2) * x1 + (supportvectors[-1][1] - w1 / w2 * supportvectors[-1][0])
plt.plot(x1, yydown, 'k--', label='Support Boundary Down') plt.plot(x1, yyup, 'k--', label='Support Boundary Up')
plt.scatter(data['X1'], data['X2'], s=50, c=data['y'], cmap='Reds') plt.title('SVM (C=1) with Decision and Support Boundaries') plt.legend() plt.show() ```
以上步骤展示了如何从原始数据读取、预处理、训练模型,到绘制分割超平面和支持超平面的过程。这些步骤不仅有助于理解SVM的工作原理,也为后续的模型优化提供了参考。