文章目录
一核函数
在现实当中,大部分时候数据并不是线性可分的,这个时候满足这样条件的超平面就根本不存在。
核函数特点及优点:
不需要每次都具体计算出原始样本点映射的新的无穷维度的样本点,直接使用映射后的新的样本点的点乘计算公式即可;
减少计算量
减少存储空间
一般将原始样本变形,通常是将低维的样本数据变为高维数据,存储高维数据花费较多的存储空间;使用核函数,不用考虑原来样本改变后的样子,也不用存储变化后的结果,只需要直接使用变化的结果进行运算并返回运算结果即可;
核函数的方法和思路不是 SVM 算法特有,只要可以减少计算量和存储空间,都可以设计核函数方便运算;
对于比较传统的常用的机器学习算法,核函数这种技巧更多的在 SVM 算法中使用;
多项式核函数
-
格式:
from sklearn.svm import SVC svc = SVC(kernel = 'ploy')
RBF核函数
高斯核函数也叫RBF核(Radia Basis Function Kernel),核函数依赖升维使得原本线性不可分的数据变得线性可分。高斯核本质是在衡量样本和样本之间的“相似度”,在一个刻画“相似度”的空间中,让同类样本更好的聚在一起,进而线性可分。
高斯核函数的思想:
业务的目的是样本分类,采用的方法:按一定规律统一改变样本的特征数据得到新的样本,新的样本按新的特征数据能更好的分类,由于新的样本的特征数据与原始样本的特征数据呈一定规律的对应关系,因此根据新的样本的分布及分类情况,得出原始样本的分类情况。
应该是试验反馈,将样本的特征数据按一定规律统一改变后,同类样本更好的凝聚在了一起;
高斯核和多项式核干的事情截然不同的,如果对于样本数量少,特征多的数据集,高斯核相当于对样本降维;
高斯核的任务:找到更有利分类任务的新的空间。
假如有一组数据,是一维的,它是线性不可分的,我们无法画一条直线将它们分开,如下图:
当我们对该数据进行升维处理后,得到数据如下:
现在,数据就变得线性可分了,我们可以画一条直线将它们分开:
高斯核本质也是做这样的事。
我们可以模拟一下:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-4,5,1)#生成测试数据
y = np.array((x >= -2 ) & (x <= 2),dtype='int')
plt.scatter(x[y==0],[0]*len(x[y==0]))# x取y=0的点, y取0,有多少个x,就有多少个y
plt.scatter(x[y==1],[0]*len(x[y==1]))
plt.show()
运行代码得到如下结果:
接下来使用高斯核函数,将一维数据映射到二维空间:
# 高斯核函数
def gaussian(x,l):
gamma = 1.0
return np.exp(-gamma * (x -l)**2)
l1,l2 = -1,1
X_new = np.empty((len(x),2)) #len(x) ,2
for i,data in enumerate(x):
X_new[i,0] = gaussian(data,l1)
X_new[i,1] = gaussian(data,l2)
plt.scatter(X_new[y==0,0],X_new[y==0,1])
plt.scatter(X_new[y==1,0],X_new[y==1,1])
plt.show()
这样一来二维数据显然是线性可分的。这里我们为了简单固定了y,二实际的核函数是:
高斯核函数将(m,n)的数据映射成(m,m)的数据,原本的n维数据经过高斯核之后变成m维
,如果m非常大,就映射成一个非常高维的空间点。如果我们的样本是无穷多个,那么它就会映射成无穷维的数据(如果向量y每个维度的值都不同),但通常来讲我们的样本都是有限的,所以得到的也是有限维的映射。
二.超参数(\gamma γ)
在高斯函数中,\gamma δ越大,分布越胖:
三.总结
使用核函数能够将复杂的数据尽可能地进行分类。
四.参考链接
https://blog.csdn.net/weixin_39884144/article/details/110325865
https://blog.csdn.net/v_july_v/article/details/7624837
https://www.cnblogs.com/volcao/p/9465214.html