Весовой вектор для регрессии ядра в Python

#python #numpy #scikit-learn #regression #non-linear-regression

Вопрос:

Я пытаюсь реализовать регрессию ядра с нуля, у меня возникла проблема с реализацией функции kernel_regression_fitting, в которой рассчитывается оптимизированный вес.

Это описание функции. Вопрос


Это мой реализованный код.

 ############## Simulate a 1-dimensional dataset ###########
import numpy as np
np.random.seed(100)

### Step 1: Simulate a simple 1D data ###
xTrain = np.expand_dims(np.linspace(-5, 5, 100), 1)  # 100*1
yTrain = np.sin(xTrain)   0.5*np.random.uniform(-1, 1, size=xTrain.shape) ## 100 *1

#################### Kernel function ###############

from scipy.spatial import distance
"""
    calcuating kernel matrix between X and Xp
"""
def rbf_kernel(X, Xp, h):
    # X: n*1 matrix
    # Xp: m*1 matrix
    # h: scalar value 
                

    K = np.exp(-1 * (np.square(distance.cdist(X, Xp))) / (2 * (np.square(h))))            
    return K #n*m

### output is a 2X3 matrix
# [[0.60653066 1.         0.60653066]
# [0.13533528 0.60653066 1.        ]]
k_test = rbf_kernel(np.array([[2],[1]]), np.array([[3],[2],[1]]), 1)
print(k_test)

############# The median trick for bandwidth ##########
def median_distance(X):
    # X: n*1 matrix
    np.fill_diagonal(X, 0)
    h = np.median(distance.pdist(X))
    return h


### Test your functions
#answer should be [2.0]
h_test = median_distance(np.array([[1],[2],[4]]))
print(h_test)
 

Этот код генерируется с использованием случайных данных, и позже я реализовал функцию fit.

 ################### Kernel Regression ########

def kernel_regression_fitting(xTrain, yTrain, h, beta=1):
    # X: input data, numpy array, n*1
    # Y: input labels, numpy array, n*1
    
     
    # W is a n*1 matrix)
    W = '????????'
  
    return W

### W shape should be (100, 1) 

h = median_distance(xTrain)
W_test = kernel_regression_fitting(xTrain, yTrain, h)
print(W_test.shape)