1.不同核函数测试
SVR是支持向量机的重要应用分支。SVR就是找到一个回归平面,让一个集合的所有数据到该平面的距离最近。
首先,导入所需要的库,然后,用随机数种子和正弦函数生成数据集,并将数据集打印出来。
接着,调用SVM的SVR函数进行支持向量回归,并同时选取核函数。
最后,使用predict函数对时间序列曲线进行预测。
代码部分:
#!/usr/bin/python
# -*- coding:utf-8 -*-import numpy as np
from sklearn import svm
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, mean_absolute_error
if __name__ == "__main__":
N = 50
#np.random.seed(0)的作用是使得随机数据可预测,当我们设置相同的seed,每次生成的随机数相同。
np.random.seed(0)
print('训练数据集(x,y):')
#numpy.random.uniform(low,high,size) #np.random.uniform(0, 6, N)功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开,即包含low,不包含high.
#参数介绍:
#low: 采样下界,float类型,默认值为0;
#high: 采样上界,float类型,默认值为1;
#size: 输出样本数目,为int或元组(tuple)类型,例如,size=(m,n,k), 则输出m*n*k个样本,缺省时输出1个值。 x = np.sort(np.random.uniform(0, 6, N), axis=0)
print ('x =\n', x)
#np.sin(a)函数:对a中元素取正弦值。
#np.random.randn(N)输出一行N列的一维数组
y = 2*np.sin(x) + 0.1*np.random.randn(N)
#numpy中reshape函数的三种常见相关用法:reshape(1,-1)转化成1行;reshape(2,-1)转换成两行;reshape(-1,1)转换成1列;reshape(-1,2)转化成两列
x = x.reshape(-1, 1)
print ('y =\n', y)
print ('SVR - RBF')
#高斯核函数的C,gamma分别设置为100和0.4
svr_rbf = svm.SVR(kernel='rbf', gamma=0.4, C=100)
svr_rbf.fit(x, y)
print ('SVR - Linear')
#线性核函数的C设置为100
svr_linear = svm.SVR(kernel='linear', C=100)
svr_linear.fit(x, y)
print ('SVR - Polynomial')
#多项式核函数的c、深度分别设置为100,3
svr_poly = svm.SVR(kernel='poly', degree=3, C=100)
svr_poly.fit(x, y)
print ('Fit OK.')
x_test = np.linspace(x.min(), 1.5*x.max(), 50)
#生成测试数据集
print('测试数据集(x_test,y_test):')
print('x_test=\n',x_test)
np.random.seed(0)
y_test = 2*np.sin(x_test) + 0.1*np.random.randn(N)
print('y_test=\n',y_test)
x_test=x_test.reshape(-1,1)
#使用predict()函数对时间序列曲线进行预测,并将三种核函数的预测结果打印出来
y_rbf = svr_rbf.predict(x_test)
y_linear = svr_linear.predict(x_test)
y_poly = svr_poly.predict(x_test)
#figsize:指定figure的宽和高,单位为英寸;facecolor:背景颜色,w为白色
plt.figure(figsize=(9, 8), facecolor='w')
#plt.plot(x, y, format_string, **kwargs),
plt.plot(x_test, y_rbf, 'r-', linewidth=2, label='RBF Kernel')
plt.plot(x_test, y_linear, 'g-', linewidth=2, label='Linear Kernel')
plt.plot(x_test, y_poly, 'b-', linewidth=2, label='Polynomial Kernel')
plt.plot(x, y, 'ks', markersize=5, label='train data')
plt.plot(x_test, y_test, 'mo', markersize=6, label='test data')
#plt.scatter()函数用于生成一个scatter散点图。x,y:表示的是shape大小为(n,)的数组,也就是我们即将绘制散点图的数据点,输入数据。s表示大小,c表示颜色,
plt.scatter(x[svr_rbf.support_], y[svr_rbf.support_], s=200, c='r', marker='*', label='RBF Support Vectors', zorder=10)
plt.legend(loc='lower left')
plt.title('SVR', fontsize=16)
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
#layout函数只考虑刻度标签,轴标签和标题
plt.tight_layout()
plt.show()
print("高斯核函数支持向量机的平均绝对误差为:", mean_absolute_error(y_test,y_rbf))
print("高斯核函数支持向量机的均方误差为:", mean_squared_error(y_test,y_rbf))
print("线性核函数支持向量机的平均绝对误差为:", mean_absolute_error(y_test,y_linear))
print("线性核函数支持向量机的均方误差为:", mean_squared_error(y_test,y_linear))
print("多项式核函数支持向量机的平均绝对误差为:", mean_absolute_error(y_test,y_poly))
print("多项式核函数支持向量机的均方误差为:", mean_absolute_error(y_test,y_poly))
运行结果:
2.高斯核函数最优参数
# !/usr/bin/python
# -*- coding:utf-8 -*-import numpy as np
from sklearn import svm
from sklearn.model_selection import GridSearchCV # 0.17 grid_search
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error, mean_absolute_error
if __name__ == "__main__":
N = 50
np.random.seed(0)
x = np.sort(np.random.uniform(0, 6, N), axis=0)
print('训练数据集(x,y):')
print ('x =\n', x)
y = 2*np.sin(x) + 0.1*np.random.randn(N)
x = x.reshape(-1, 1)
print ('y =\n', y)
#使用SVR模型,高斯核函数
model = svm.SVR(kernel='rbf')
#在指定的大间隔内(start,stop),返回固定间隔的数据。他们返回num个等间距的样本。
c_can = np.linspace(105,107,10)
print('c_can=',c_can)
gamma_can = np.linspace(0.4, 0.5, 10)
print('gamma_can=',gamma_can)
#采用 GridSearchCV函数建立参数模型
svr_rbf = GridSearchCV(model, param_grid={'C': c_can, 'gamma': gamma_can}, cv=5)
svr_rbf.fit(x, y)
print ('最优参数:\n', svr_rbf.best_params_)
print('测试数据集(x_test,y_test):')
x_test = np.linspace(x.min(), 1.5*x.max(), 50)
print('x_test=\n',x_test)
np.random.seed(0)
y_test = 2*np.sin(x_test) + 0.1*np.random.randn(N)
print('y_test=\n',y_test)
x_test=x_test.reshape(-1,1)
y_rbf = svr_rbf.predict(x_test)
print('高斯核的预测值:')
print('y_rbf=\n',y_rbf)
#选取最优的参数组合,预测并生成图表
sp = svr_rbf.best_estimator_.support_
plt.figure(figsize=(9, 8),facecolor='w')
plt.scatter(x[sp], y[sp], s=200, c='r', marker='*', label='Support Vectors')
plt.plot(x_test, y_rbf, 'r-', linewidth=2, label='RBF Kernel')
plt.plot(x, y, 'ks', markersize=5, label='train data')
plt.plot(x_test, y_test, 'mo', markersize=5, label='test data')
plt.legend(loc='lower left')
plt.title('SVR', fontsize=16)
plt.xlabel('X')
plt.ylabel('Y')
plt.grid(True)
plt.show()
print("选取最优参数的高斯核函数支持向量机的平均绝对误差为:", mean_absolute_error(y_test,y_rbf))
print("选取最优参数的高斯核函数支持向量机的均方误差为:", mean_squared_error(y_test,y_rbf))
运行结果: