我知道如何使用Scikit-Learn构建支持向量机,但现在我想从头开始在Python中实现,而不使用Scikit-Learn。由于对内部过程不了解,我感到很困惑。如果能得到帮助并实现这一点,我将不胜感激。
回答:
你可以仅使用numpy
实现一个简单的线性SVM,如下所示。另外,请在下次提问前先在谷歌上搜索。网上有很多资源和教程。
import numpy as np def my_svm(dataset, label): rate = 1 # 梯度下降的学习率 epochs = 10000 # 迭代次数 weights = np.zeros(dataset.shape[1]) # 创建一个数组用于存储权重 # 通过梯度下降最小化目标函数(Hinge损失) for epoch in range(1,epochs): for n, data in enumerate(dataset): if (label[n] * np.dot(dataset[n], weights)) < 1: weights = weights + rate * ( (dataset[n] * label[n]) + (-2 *(1/epoch)* weights) ) else: weights = weights + rate * (-2 * (1/epoch) * weights) return weights def predict(test_data,weights): results = [] for data in test_data: result = np.dot(data,weights) results.append(-1 if result < 0 else 1) return results
生成用于训练和测试的数据集
dataset = np.array([ [-2, 4,-1], #x_cood,y_cood,bias [4, 1, -1], [0, 2, -1], [1, 6, -1], [2, 5, -1], [6, 2, -1] ]) label = np.array([-1,-1,-1,1,1,1]) weights = my_svm(dataset,label)
测试它
test_data = np.array([ [0,3,-1], #应该属于-1 [4,5,-1] #应该属于1 ]) predict(test_data, weights) >Out[10]: [-1, 1]