用python写一个支持向量机
时间: 2024-04-30 20:20:28 浏览: 8
好的,我可以为您提供一个简单的Python实现支持向量机的示例代码。但请注意,这只是一个基本的实现,您需要根据自己的需求进行修改和扩展。
首先,我们需要导入必要的库:
```python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
```
接下来,我们定义一个简单的数据集:
```python
data_dict = {-1: np.array([[1, 7], [2, 8], [3, 8]]), 1: np.array([[5, 1], [6, -1], [7, 3]])}
```
其中,-1代表一类数据,1代表另一类数据。数据集中包含了6个样本,每个样本都是一个二维向量。
接下来,我们实现SVM类:
```python
class SVM:
def __init__(self):
self.w = None
self.b = None
def fit(self, data):
# 初始化SVM参数
opt_dict = {}
transforms = [[1, 1], [-1, 1], [-1, -1], [1, -1]]
all_data = []
for yi in data:
for featureset in data[yi]:
for feature in featureset:
all_data.append(feature)
max_feature_value = max(all_data)
min_feature_value = min(all_data)
all_data = None
step_sizes = [max_feature_value * 0.1, max_feature_value * 0.01, max_feature_value * 0.001]
b_range_multiple = 5
b_multiple = 5
latest_optimum = max_feature_value * 10
for step in step_sizes:
w = np.array([latest_optimum, latest_optimum])
optimized = False
while not optimized:
for b in np.arange(-1 * (max_feature_value * b_range_multiple), max_feature_value * b_range_multiple, step * b_multiple):
for transformation in transforms:
w_t = w * transformation
found_option = True
for i in data:
for xi in data[i]:
yi = i
if not yi * (np.dot(w_t, xi) + b) >= 1:
found_option = False
if found_option:
opt_dict[np.linalg.norm(w_t)] = [w_t, b]
if w[0] < 0:
optimized = True
print("Optimized a step.")
else:
w = w - step
norms = sorted([n for n in opt_dict])
opt_choice = opt_dict[norms[0]]
self.w = opt_choice[0]
self.b = opt_choice[1]
latest_optimum = opt_choice[0][0] + step * 2
def predict(self, features):
classification = np.sign(np.dot(np.array(features), self.w) + self.b)
return classification
```
这个SVM类有三个方法:
- `__init__`:初始化SVM参数。
- `fit`:训练SVM模型。
- `predict`:预测样本的类别。
在`fit`方法中,我们使用SMO算法来优化SVM模型。具体来说,我们首先初始化一些变量,然后在多个参数空间中搜索最优解。每次搜索都会更新SVM参数。最后,我们选择具有最小权重向量范数的参数作为最终的SVM参数。
最后,我们使用SVM类来训练模型并进行预测:
```python
svm = SVM()
svm.fit(data_dict)
for yi in data_dict:
for xi in data_dict[yi]:
print(xi, ':', svm.predict(xi))
```
这里只是简单地输出了每个样本的预测类别。您可以根据自己的需求进行修改和扩展。
完整代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import style
style.use("ggplot")
data_dict = {-1: np.array([[1, 7], [2, 8], [3, 8]]), 1: np.array([[5, 1], [6, -1], [7, 3]])}
class SVM:
def __init__(self):
self.w = None
self.b = None
def fit(self, data):
# 初始化SVM参数
opt_dict = {}
transforms = [[1, 1], [-1, 1], [-1, -1], [1, -1]]
all_data = []
for yi in data:
for featureset in data[yi]:
for feature in featureset:
all_data.append(feature)
max_feature_value = max(all_data)
min_feature_value = min(all_data)
all_data = None
step_sizes = [max_feature_value * 0.1, max_feature_value * 0.01, max_feature_value * 0.001]
b_range_multiple = 5
b_multiple = 5
latest_optimum = max_feature_value * 10
for step in step_sizes:
w = np.array([latest_optimum, latest_optimum])
optimized = False
while not optimized:
for b in np.arange(-1 * (max_feature_value * b_range_multiple), max_feature_value * b_range_multiple, step * b_multiple):
for transformation in transforms:
w_t = w * transformation
found_option = True
for i in data:
for xi in data[i]:
yi = i
if not yi * (np.dot(w_t, xi) + b) >= 1:
found_option = False
if found_option:
opt_dict[np.linalg.norm(w_t)] = [w_t, b]
if w[0] < 0:
optimized = True
print("Optimized a step.")
else:
w = w - step
norms = sorted([n for n in opt_dict])
opt_choice = opt_dict[norms[0]]
self.w = opt_choice[0]
self.b = opt_choice[1]
latest_optimum = opt_choice[0][0] + step * 2
def predict(self, features):
classification = np.sign(np.dot(np.array(features), self.w) + self.b)
return classification
svm = SVM()
svm.fit(data_dict)
for yi in data_dict:
for xi in data_dict[yi]:
print(xi, ':', svm.predict(xi))
```