scikit学习svm总是给出恒定的线条拟合

时间:2016-02-20 14:54:11

标签: machine-learning scikit-learn regression svm

我无法理解为什么即使在显着改变参数之后我也能获得相同的恒定线条拟合

我的代码 -

data_set = np.reshape([d[len(d)-2] for d in data_vector], (len(data_vector), 1)); 

plt.scatter(data_set, Y[:,0], c='k', label='data');
#train the regression model

C_Array = [1, 1e2, 1e3, 1e-2, 1e-3, 1e4, 1e-4];
colors = ['b', 'g', 'r', 'c', 'm', 'y', 'k'];
ind = 0;
for c in C_Array:
    svr_rbf = SVR(kernel="rbf", C=c, gamma=0.001);
    plt.hold('on');    
    y1_predictor = svr_rbf.fit(data_set, Y[:, 0]);
    y2_predictor = svr_rbf.fit(data_set, Y[:, 1]);

    sys.stdout.write(".");
    my_prediction = y1_predictor.predict(data_set)
    plt.plot(data_set, my_prediction, c=colors[ind], label='RBF model')
    ind = ind + 1;
plt.show();    

输出 - enter image description here

1 个答案:

答案 0 :(得分:3)

在拟合SVR之前缩放数据(目前X轴上的值为200-1000,Y轴上的值为-400-400),否则您可能需要非常大的gamma / C值才能获得任何合理的结果。这正是正在发生的事情,因为这样的巨大价值1e4是小到让SVR学习任何东西的方法。此外,对于这种规模,很容易使浮子下溢/溢出。你正在使用形式为exp(-g | x-y | ^ 2)的RBF内核,因此如果| x-y |是~400(这是你的数据中的情况),然后你得到exp(-0.001 * 160000),它在数值上为零。