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))

运行结果:

svr参数python svr python_支持向量机

 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))

运行结果:

svr参数python svr python_svr参数python_02