支持向量机是怎么画分类平面的?
![支持向量机是怎么画分类平面的?_第1张图片](http://img.e-com-net.com/image/info8/31b4c6f3fdca47069ee33092ab01e09a.jpg)
![支持向量机是怎么画分类平面的?_第2张图片](http://img.e-com-net.com/image/info8/7c981e84528249faa1739484f7814fdb.jpg)
![支持向量机是怎么画分类平面的?_第3张图片](http://img.e-com-net.com/image/info8/029f0859416d41f8979257911ad24e01.jpg)
![支持向量机是怎么画分类平面的?_第4张图片](http://img.e-com-net.com/image/info8/293219ddc2094cdb8f6f8d2cc66516c5.jpg)
![支持向量机是怎么画分类平面的?_第5张图片](http://img.e-com-net.com/image/info8/5b3aff6720934ea287706a1dd2d0c6bf.jpg)
![支持向量机是怎么画分类平面的?_第6张图片](http://img.e-com-net.com/image/info8/a04390c4789746aea3cedef0f8e62d32.jpg)
![支持向量机是怎么画分类平面的?_第7张图片](http://img.e-com-net.com/image/info8/960d0066857c479595b6df77524cbfde.jpg)
![支持向量机是怎么画分类平面的?_第8张图片](http://img.e-com-net.com/image/info8/8f8429f47d9443bfb292aceb9f077063.jpg)
![支持向量机是怎么画分类平面的?_第9张图片](http://img.e-com-net.com/image/info8/2a4352b9ac7d4448b6b30c665f99c0c5.jpg)
![支持向量机是怎么画分类平面的?_第10张图片](http://img.e-com-net.com/image/info8/4c220061282f4c31aaf31addc1e8323c.jpg)
![支持向量机是怎么画分类平面的?_第11张图片](http://img.e-com-net.com/image/info8/58f86eba0628440980272b26bb71435a.jpg)
![支持向量机是怎么画分类平面的?_第12张图片](http://img.e-com-net.com/image/info8/52c4c01414a745a3a2f36d537bddb89f.jpg)
![支持向量机是怎么画分类平面的?_第13张图片](http://img.e-com-net.com/image/info8/24d6351c01eb4c1d8a2f55ed124823e4.jpg)
![支持向量机是怎么画分类平面的?_第14张图片](http://img.e-com-net.com/image/info8/57349bf9985f410bb8ed1008398e751b.jpg)
![支持向量机是怎么画分类平面的?_第15张图片](http://img.e-com-net.com/image/info8/56f3a7adbd2c40ffb428cda9500839ea.jpg)
![支持向量机是怎么画分类平面的?_第16张图片](http://img.e-com-net.com/image/info8/c8d68893f3984a60945f535f5d67d6cf.jpg)
#coding:utf-8
"""
损失函数形式的支持向量机演示算法
"""
import numpy as np
from matplotlib import pyplot as plt
from matplotlib.colors import ListedColormap
# 线性支持向量机模型
class LinearSVM:
# 构建分类模型
def __init__(self, x, y, c=1, learning_rate=0.01, iterations=1000):
"""
:param x: 训练实例
:param y: 训练标记
:param c: 惩罚因子
:param learning_rate: 学习率
:param iterations: 最大迭代次数
"""
# 权值初始值
self.w = np.array([0, 0])
# 偏置初始值
self.b = 0
# 训练过程
for j in range(1, iterations+1):
print("iter ", j)
print("w=", self.w)
print("b=", self.b)
# 计算误差向量
ei_li = []
for i in range(x.shape[0]):
ei = 1 - y[i] * (np.dot(self.w, x[i, :]) + self.b)
ei_li.append(ei)
# 取出误差最大项
max_e = max(ei_li)
max_e_index = ei_li.index(max_e)
# 最大误差项<=0 退出
if max_e <= 0:
break
# 更新参数
self.w = (1-learning_rate) * self.w + learning_rate * c * y[max_e_index] * x[max_e_index, :]
self.b = self.b + learning_rate * c * y[max_e_index]
# 训练结束
print("w=", self.w)
print("b=", self.b)
# 画决策面
colors = ('red', 'blue')
cmap = ListedColormap(colors[:len(np.unique(y))])
x1_min, x1_max = x[:, 0].min() - 1, x[:, 0].max() + 1
x2_min, x2_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, 0.02),
np.arange(x2_min, x2_max, 0.02))
Z = self.predict(np.array([xx1.ravel(), xx2.ravel()]))
Z = Z.reshape(xx1.shape)
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
# 画样本点
markers = ('s', 'x')
for idx, ci in enumerate(np.unique(y)):
plt.scatter(x=x[y == ci, 0], y=x[y == ci, 1], alpha=0.8, c=cmap(idx), marker=markers[idx], label=ci)
# 画图例
plt.legend(loc='upper left')
plt.show()
# 预测
def predict(self, x):
return np.dot(self.w, x) + self.b
if __name__ == "__main__":
x = np.array([[1, 2],
[2, 3],
[3, 3],
[2, 1],
[3, 2]])
y = np.array([1, 1, 1, -1, -1])
svm = LinearSVM(x, y)
![支持向量机是怎么画分类平面的?_第17张图片](http://img.e-com-net.com/image/info8/6e4b0f8a8fcc400ca976b79505332091.jpg)
![支持向量机是怎么画分类平面的?_第18张图片](http://img.e-com-net.com/image/info8/461c2fce0f0b4d9bbdd740f566b50bf3.jpg)
![支持向量机是怎么画分类平面的?_第19张图片](http://img.e-com-net.com/image/info8/f07d1bf9375642e19f574d240ed8c8fc.jpg)