python实现svm代码
以下是一个简单的Python实现SVM的代码示例:
import numpy as np
class SVM:
def __init__(self, learning_rate=0.01, lambda_param=0.01, n_iters=1000):
self.lr = learning_rate
self.lambda_param = lambda_param
self.n_iters = n_iters
self.w = None
self.b = None
def fit(self, X, y):
n_samples, n_features = X.shape
y_ = np.where(y <= 0, -1, 1)
self.w = np.zeros(n_features)
self.b = 0
for _ in range(self.n_iters):
for idx, x_i in enumerate(X):
condition = y_[idx] * (np.dot(x_i, self.w) - self.b) >= 1
if condition:
self.w -= self.lr * (2 * self.lambda_param * self.w)
else:
self.w -= self.lr * (2 * self.lambda_param * self.w - np.dot(x_i, y_[idx]))
self.b -= self.lr * y_[idx]
def predict(self, X):
approx = np.dot(X, self.w) - self.b
return np.sign(approx)
这个SVM类包含了fit和predict方法。fit方法用于训练模型,predict方法用于预测新的数据点。在fit方法中,我们使用梯度下降来最小化SVM的损失函数。在predict方法中,我们使用训练模型来预测新的数据点的类别。
接下来我会详细解释一下这个SVM类的实现。
首先,在SVM的构造函数中,我们定义了三个超参数:学习率(learning_rate)、正则化参数(lambda_param)和迭代次数(n_iters)。这些超参数可以根据具体问题进行调整。
接下来,我们定义了fit方法。在这个方法中,我们首先将标签y中小于等于0的值转换为-1,大于0的值转换为1。然后,我们初始化权重向量w和偏置b为0。
在每次迭代中,我们遍历训练集中的每个样本,并计算它们的预测值。如果预测值与真实标签的乘积大于等于1,则说明该样本被正确分类,我们只需要更新权重向量w。如果预测值与真实标签的乘积小于1,则说明该样本被错误分类,我们需要同时更新权重向量w和偏置b。
最后,我们定义了predict方法。在这个方法中,我们使用训练权重向量w和偏置b来预测新的数据点的类别。我们计算新数据点的预测值,并使用np.sign函数将其转换为-1或1的类别标签。
这个SVM类的实现比较简单,但是可以作为一个基础的SVM模型来使用。如果需要更高级的SVM模型,可以使用现有的机器学习库,如scikit-learn。