用python实现硬间隔 svm
时间: 2023-06-09 13:07:05 浏览: 112
好的,这里是用Python实现硬间隔支持向量机(SVM)的示例代码:
```
# 导入相关库
import numpy as np
import matplotlib.pyplot as plt
# 生成数据
np.random.seed(42)
num_observations = 500
x1 = np.random.multivariate_normal([0, 0], [[1, .75],[.75, 1]], num_observations)
x2 = np.random.multivariate_normal([1, 4], [[1, .75],[.75, 1]], num_observations)
X = np.vstack((x1, x2)).astype(np.float32)
y = np.hstack((-np.ones(num_observations), np.ones(num_observations)))
# 绘制数据分布
plt.figure(figsize=(12,8))
plt.scatter(X[:, 0], X[:, 1], c=y, alpha = .4)
plt.show()
# 训练SVM模型
def svm_sgd(X, Y):
w = np.zeros(len(X[0]))
eta = 1
epochs = 100000
for epoch in range(1, epochs):
for i, x in enumerate(X):
if (Y[i]*np.dot(X[i], w)) < 1:
w = w + eta * ((X[i] * Y[i]) + (-2 * (1/epoch) * w))
else:
w = w + eta * (-2 * (1/epoch) * w)
return w
# 进行预测
w = svm_sgd(X, y)
print(w)
```
这是一个基于随机梯度下降(SGD)算法实现的SVM模型,可以用于解决二分类问题。在代码中,我们首先生成了两类服从不同高斯分布的数据,并将它们绘制在二维平面上。接着,我们定义了一个SVM_sgd函数用于训练SVM模型,其中eta是学习率,epochs是训练轮数,w是要训练的权重参数,X和Y分别是输入数据和对应的标签。在每一轮训练中,我们根据当前样本的分类情况,来更新权重向量w,最终得到分类超平面。最后,我们输出得到的权重向量w,可以用于预测新的样本的分类。
阅读全文