#python #numpy #matplotlib #machine-learning
Вопрос:
Я создал свою собственную функцию регрессии ядра, и это мой код.
#given from scipy.spatial import distance from sklearn.linear_model import LinearRegression import numpy as np import matplotlib import matplotlib.pyplot as plt %matplotlib inline #given np.random.seed(100) xTrain = np.expand_dims(np.linspace(-5, 5, 100), 1) yTrain = np.sin(xTrain) 0.5*np.random.uniform(-1, 1, size=xTrain.shape) def rbf_kernel(X, Xp, h): dist = distance.cdist(X,Xp,'euclidean') K = np.exp(-((dist)**2)/(2*((h)**2))) return K def median_distance(X): dist = [] for i in range(len(X)): for j in range(len(X)): if i != j: dist.append(abs(X[i]-X[j])) h = np.median(dist) return h def kernel_regression_fitting(xTrain, yTrain, h, beta=1): a = np.linalg.inv(rbf_kernel(xTrain,yTrain,h) (beta*np.identity(xTrain.shape[0]))) W = a.dot(yTrain) return W #given def kernel_regression_fit_and_predict(xTrain, yTrain, xTest, h, beta): W = kernel_regression_fitting(xTrain, yTrain, h, beta) K_xTrain_xTest = rbf_kernel(xTrain, xTest, h) yPred = np.dot( K_xTrain_xTest.T, W) return yPred #given beta = 1. xTest = np.expand_dims(np.linspace(-6, 6, 200), 1) h_med = median_distance(xTrain) yHatk = kernel_regression_fit_and_predict(xTrain, yTrain, xTest, h_med, beta) #given lr = LinearRegression() lr.fit(xTrain, yTrain) yHat = lr.predict(xTest) #given plt.plot(xTrain, yTrain, '*') plt.plot(xTest, yHat, '*') plt.plot(xTest, yHatk, '-k') plt.show()
Результат должен быть таким :
Я говорю, что так и должно быть, потому что шаблон «синяя звезда» — это то, что вы получаете, когда строите только xtrain и ytrain, прежде чем я объявлю какую-либо функцию в своем коде.
Черная линия-это наше предсказание метки с использованием ядра. Поскольку это предсказание метки, то мы все знаем, что результат будет более менее похожим на наш график xtrain и ytrain
И, наконец, оранжевая линия-это наша линейная регрессия. Это очевидно, потому что это линейная линия, и направление линии должно следовать нашему шаблону.
#given
означает, что код уже дан из исходного кода. Что я сделал, так это создал ядро rbf, медианное расстояние и функцию подгонки регрессии ядра для достижения правильного графика.
Но то, что я получаю, похоже на это :
Почему мой результат отличается от того, каким он должен быть?
Комментарии:
1. Почему именно результаты должны быть такими, как вы показываете на 1-м графике? Пожалуйста, обновите свой пост, чтобы включить источник.
2. Готово, я отредактировал свой пост.