数据线性不可分,但是它能被区分开,如下图:
有些数据肉眼看,不能分,但是经过低维到高维数据变得可分,如下例:
算法思想都是一样的:同线性可分,只不过将数据映射到高维空间去
x-> φ(x)
核技巧(kernel trick)通过一个核函数将数据映射到高纬空间。
ω(x) : 无限维, 映射函数,可以不知道它的显示表达式
k(x1,x2) = φ( x1 )Tφ(x2) (内积将无限维变成一个数)
核函数:
rbf: 高斯核
ploy: 多项式核
Linear: 线性内核
thanh核
二:sklearn (借助现有机器学习工具,所有算法都自己撸代码,人着不住的)
sklearn: 关于svm的学习有很好的例子
https://scikit-learn.org/stable/modules/svm.html
实现一个非线性分类的svm
import numpy as np
import pandas as pd
from matplotlib import style
from sklearn.svm import SVC
from sklearn.datasets import make_gaussian_quantiles
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] =(12,6)
style.use('ggplot')
x, y = make_gaussian_quantiles(n_samples=100,n_features=2,n_classes=2,cov=2)
def draw_svm(x,y,C=1.0,gamma='auto'):
plt.scatter(x[:,0],x[:,1],c=y)
clf = SVC(kernel='rbf',C=C,gamma=gamma)
clf_fig = clf.fit(x,y)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xx = np.linspace(xlim[0],xlim[1],200)
yy = np.linspace(ylim[0],ylim[1],200)
XX,YY = np.meshgrid(xx,yy)
xy = np.vstack([XX.ravel(),YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
ax.contour(XX,YY,Z,colors='r',levels=[-1,0,1],
alpha=0.5,linestyles=['--','-','--'])
ax.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=10)
print("预测[1,2]的分类:")
print(clf.predict([[1.,2.]]))
draw_svm(x,y,C=10)
b站上浙江大学机器学习课程笔记:
Reference:
[1]:https://www.bilibili.com/video/BV1dJ411B7gh?from=search&seid=590519869570777855
浙江大学-研究生机器学习课程
[2]: https://mubaris.com/posts/svm/
[3]: https://scikit-learn.org/stable/modules/svm.html