svm核心算法python实现
时间: 2023-07-26 10:29:57 浏览: 99
SVM(Support Vector Machine)是一种非常流行的机器学习算法,用于分类和回归问题。它的核心思想是找到一个最优的超平面,将不同类别的数据分开。
下面是SVM的核心算法在Python中的实现:
首先,导入必要的库:
```python
import numpy as np
from cvxopt import matrix, solvers
```
然后,定义一个函数,用于计算SVM模型的参数:
```python
def svm_train(X, y, C, kernel):
n_samples, n_features = X.shape
# Gram matrix
K = np.zeros((n_samples, n_samples))
for i in range(n_samples):
for j in range(n_samples):
K[i,j] = kernel(X[i], X[j])
# Solve the quadratic optimization problem
P = matrix(np.outer(y,y) * K)
q = matrix(-1 * np.ones(n_samples))
G = matrix(np.vstack((np.eye(n_samples)*-1,np.eye(n_samples))))
h = matrix(np.hstack((np.zeros(n_samples), np.ones(n_samples) * C)))
A = matrix(y, (1,n_samples))
b = matrix(0.0)
# Obtain the Lagrange multipliers
sol = solvers.qp(P, q, G, h, A, b)
a = np.array(sol['x']).reshape(n_samples)
# Support vectors have non zero lagrange multipliers
sv = a > 1e-5
ind = np.arange(len(a))[sv]
a = a[sv]
sv_x = X[sv]
sv_y = y[sv]
# Intercept
b = 0
for n in range(len(a)):
b += sv_y[n]
b -= np.sum(a * sv_y * K[ind[n],sv])
b /= len(a)
# Weight vector
if kernel == linear_kernel:
w = np.zeros(n_features)
for n in range(len(a)):
w += a[n] * sv_y[n] * sv_x[n]
else:
w = None
return a, sv_x, sv_y, w, b
```
这个函数接受四个参数:
- `X`:输入数据的特征矩阵,大小为 `n_samples x n_features`;
- `y`:输入数据的标签向量,大小为 `n_samples`;
- `C`:SVM模型的参数,用于控制模型的容错性;
- `kernel`:SVM模型的核函数,可以是线性或非线性核函数。
在函数内部,首先计算Gram矩阵,然后使用`cvxopt`库中的`solvers.qp`函数求解二次规划问题,得到Lagrange乘子。接着,将Lagrange乘子大于阈值的样本作为支持向量,计算模型的权重和截距,最后返回模型的参数。
下面是一个简单的线性SVM模型的例子:
```python
# Linear kernel
def linear_kernel(x1, x2):
return np.dot(x1, x2)
# Generate random data
np.random.seed(0)
X = np.random.randn(100, 2)
y = np.where(X[:,0] + X[:,1] > 0, 1, -1)
# Train the model
a, sv_x, sv_y, w, b = svm_train(X, y, C=1, kernel=linear_kernel)
# Print the results
print("Lagrange multipliers:\n", a)
print("Support vectors:\n", sv_x)
print("Intercept:\n", b)
```
这个例子生成了一个随机的二维数据集,并使用线性核函数训练了一个SVM模型。最后,打印了模型的参数。
需要注意的是,上面的实现并不是最优化的实现方式,如果需要在实际应用中使用,还需要对代码进行优化和调试。
阅读全文