有没有可能为skkernelridge提供一个提供Gram矩阵的可调用内核?

2024-09-30 19:33:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用sklearn.kernel\u脊.KernelRidge函数的一个自定义内核(wendland kernel),它不是用python实现的,所以我必须提供一个可调用的函数(我想避免使用'precomputed'选项,以便使它与我的其他模型保持一致)。问题是,callable必须返回一个float数,因此对于每个数据点调用它一次,这会导致真正的缓慢训练。你知道吗

看一个类似的设置模型,即。支持向量机.SVR,必须提供一个可调用的内核函数,该函数一次返回整个内核矩阵,这使得它的速度更快。你知道吗

所以我的问题是,是否有可能让KernelRidge函数接受一个可调用的函数,它在一步中提供gram矩阵,从而加快进程?还有其他选择吗?你知道吗

import numpy as np
from sklearn.kernel_ridge import KernelRidge
from sklearn.metrics.pairwise import check_pairwise_arrays, euclidean_distances

def Wendland_kernel(eps=None):
    #Kernel I want to use und am allowed to use with SVM.SVR
    def Wendland_gram_intern(X, Y=None, eps=eps):
        X, Y = check_pairwise_arrays(X,Y)        
        if eps is None:
            eps = 1.0 / X.shape[1]        
        K = euclidean_distances(X, Y, squared=False)
        K = 1 - eps*K        
        return np.maximum(K,0)**2    
    return Wendland_gram_intern

def Wendland_single(eps=None):
    #Kernel I have to use
    def Wendland_single_intern(x1, y1, eps=eps):        
        K = np.linalg.norm(x1-y1)
        K = 1 - eps*K        
        return np.maximum(K,0)**2    
    return Wendland_single_intern

X = np.random.random((10,2))
y = np.random.normal(size=(10,))

clf = KernelRidge(kernel=Wendland_single(eps=2.5))
clf.fit(X, y)
print(clf.predict([[0.5,0.5]]))

Tags: 函数importnonereturndefnpsklearneps