import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
X = np.linspace(0,2*np.pi,50).reshape(-1,1)
y = np.sin(X)
plt.scatter(X,y)
建模
线性核函数
svr = SVR(kernel = 'linear')
svr.fit(X,y.ravel())#变成一维y_ = svr.predict(X)
plt.scatter(X,y)plt.plot(X,y_,color='red')
poly多项式核函数
svr = SVR(kernel = 'poly',degree=2)
svr.fit(X,y.ravel())#变成一维y_ = svr.predict(X)
plt.scatter(X,y)plt.plot(X,y_,color='red')
rbf高斯核函数
svr = SVR(kernel = 'rbf')
svr.fit(X,y.ravel())y_ = svr.predict(X)
plt.scatter(X,y)plt.plot(X,y_,color='red')
天猫双十一销量数据
X= np.arange(2009,2020) - 2008
y = np.array([0.5,9.36,52,191,350,571,912,1207,1632,2135,2684])
plt.scatter(X,y,color = 'red')
标准化
X_test=np.linspace(2009,2019,100).reshape(-1,1)-2008
svr = SVR(kernel = 'linear')
svr.fit(X.reshape(-1,1),y)y_= svr.predict(X_test)plt.scatter(X,y,color = 'red')plt.plot(X_test.ravel(),y_,color='green')
svr = SVR(kernel = 'rbf')
svr.fit(X.reshape(-1,1),y)y_= svr.predict(X_test)plt.scatter(X,y,color = 'red')plt.plot(X_test.ravel(),y_,color='green')
svr = SVR(kernel = 'poly',coef0=200)#多项式
svr.fit(X.reshape(-1,1),y)y_= svr.predict(X_test)plt.scatter(X,y,color = 'red')plt.plot(X_test.ravel(),y_,color='green')
可以看见poly核函数最好
在机器学习中,特别是在支持向量机(SVM)算法中,核函数是一种将数据从原始特征空间映射到更高维特征空间的数学函数,以便在新的空间中更容易地进行线性分割。以下是三种常见核函数的区别:
-
线性核函数(Linear Kernel):
- 公式:K(x,y)=x⋅yK(x,y)=x⋅y
- 描述:线性核函数实际上不进行映射,它直接在原始特征空间中计算两个点的点积。这意味着它不会增加特征的维度。
- 适用情况:当数据已经是线性可分的,或者特征空间的维度不是问题时,线性核函数是一个很好的选择。
-
多项式核函数(Polynomial Kernel,也称为Poly Kernel):
- 公式:K(x,y)=(γ⋅x⋅y+r)dK(x,y)=(γ⋅x⋅y+r)d
- 参数:γγ 是核函数的系数,rr 是偏置项,dd 是多项式的度数。
- 描述:多项式核函数将数据映射到一个多项式特征空间。通过调整度数 dd,可以控制映射后的维度和复杂性。
- 适用情况:当数据具有非线性特征,需要通过增加特征的组合来提高模型的表达能力时。
-
径向基函数(Radial Basis Function,RBF或Gaussian Kernel):
- 公式:K(x,y)=exp(−γ∥x−y∥2)K(x,y)=exp(−γ∥x−y∥2)
- 参数:γγ 是核函数的系数,控制了高斯函数的宽度。
- 描述:RBF核函数通过计算两个点之间的欧几里得距离的平方,并将其作为指数函数的输入,从而实现非线性映射。这种核函数可以捕捉数据中的复杂模式。
- 适用情况:RBF核是SVM中最常用的核函数之一,适用于大多数非线性问题,特别是当数据的分布不是线性的,或者需要捕捉更复杂的边界时。
每种核函数都有其特点和适用场景。选择哪种核函数通常取决于数据的特性和问题的需求。在实践中,可能需要通过交叉验证等方法来确定最佳的核函数和参数。