Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用自己的rbf函数替换sklearn中的svm.SVR“rbf”内核?_Python_Matrix_Scikit Learn_Svm - Fatal编程技术网

Python 如何使用自己的rbf函数替换sklearn中的svm.SVR“rbf”内核?

Python 如何使用自己的rbf函数替换sklearn中的svm.SVR“rbf”内核?,python,matrix,scikit-learn,svm,Python,Matrix,Scikit Learn,Svm,我开发了以下代码,用于启动svm方法的项目: import numpy as np import pandas as pd from sklearn import svm from sklearn.datasets import load_boston from sklearn.metrics import mean_absolute_error housing = load_boston() df = pd.DataFrame(np.c_[housing['data'], housing[

我开发了以下代码,用于启动svm方法的项目:

import numpy as np
import pandas as pd

from sklearn import svm
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error

housing = load_boston()
df = pd.DataFrame(np.c_[housing['data'], housing['target']],
              columns= np.append(housing['feature_names'], ['target']))

features = df.columns.tolist()
label = features[-1]
features = features[:-1]

x_train = df[features].iloc[:400]
y_train = df[label].iloc[:400]

x_test = df[features].iloc[400:]
y_test = df[label].iloc[400:]

svr = svm.SVR(kernel='rbf')
svr.fit(x_train, y_train)
y_pred = svr.predict(x_test)

print(mean_absolute_error(y_pred, y_test))
现在我想使用我定制的rbf内核,它是:

def my_rbf(feat, lbl):
#feat = feat.values
    #lbl = lbl.values
    ans = np.array([])
    gamma = 0.000005
    for i in range(len(feat)):
        ans = np.append(ans, np.exp(-gamma * np.dot(feat[i]-lbl[i], feat[i]-lbl[i])))

    return ans
然后我改变了svm.SVRkernel=my_rbf,但在以任何方式修改它时,我都会得到很多错误。我还尝试使用一个简单的函数,如np.dotfeat lbl,feat lbl,它在SVR.fit方法中运行良好,但在SVR.predict中出现了一些错误,即输入矩阵的形状必须类似于[n_samples_test,n_samples_train]

我无法处理这些错误。有人能帮我完成这段代码吗?

您编写的自定义内核方法my_rbf同时使用X特征和y标签。您无法在预测期间计算此函数,因为您无法访问标签。自定义内核如果有缺陷

背景

RBF函数的定义如下:

其中x和x'是两个特征x向量

设HX是一个函数,它将向量X变换为其他维度,通常变换为非常高的维度。SVM需要计算所有特征向量组合(即所有HX)之间的点积。所以如果HX1。HX2=KX1,X2那么K被称为核函数或H的核化。因此,不是将点X1和X2转换为非常高的维度并计算那里的点积,而是直接从X1和X2计算

结论 my_rbf不是一个有效的核函数,因为它使用标签Ys。它应该只在特征向量上

根据我所寻找的RBF函数,将训练特征作为X,测试特征作为X'作为输入和输出[n_training_samples,n_testing_samples],如中所述,如下所示:

def my_kernel(X,Y):
    K = np.zeros((X.shape[0],Y.shape[0]))
    for i,x in enumerate(X):
        for j,y in enumerate(Y):
            K[i,j] = np.exp(-1*np.linalg.norm(x-y)**2)
    return K

clf=SVR(kernel=my_kernel)
其结果正好等于:

clf=SVR(kernel="rbf",gamma=1)

就速度而言,它缺乏与默认svm库rbf一样有效的性能。将cython库用于索引和numpy数组可能会有帮助,以稍微加快速度。

好吧,那么,我应该如何替换my_rbf函数并使代码像使用默认内核='rbf'时那样工作?