Я пытался сопоставить ортогональные полиномы в следующем коде в R:
X <- cbind(1, poly(x = x, degree = 9))
но в python.
Для этого я применил свой собственный метод для предоставления ортогональных многочленов:
def get_hermite_poly(x,degree):
#scipy.special.hermite()
N, = x.shape
##
X = np.zeros( (N,degree+1) )
for n in range(N):
for deg in range(degree+1):
X[n,deg] = hermite( n=deg, z=float(x[deg]) )
return X
хотя он, похоже, не соответствует этому. Кто-нибудь знает тип ортогонального полинома, который он использует? Я попробовал поиск в документации, но не сказал.
Чтобы дать некоторый контекст, я пытаюсь реализовать следующий код R в python (https://stats.stackexchange.com/info/313265/issue-with-convergence-with-sgd-with-function-approximation-using-polynomial-lin/315185#comment602020_315185):
set.seed(1234)
N <- 10
x <- seq(from = 0, to = 1, length = N)
mu <- sin(2 * pi * x * 4)
y <- mu
plot(x,y)
X <- cbind(1, poly(x = x, degree = 9))
# X <- sapply(0:9, function(i) x^i)
w <- rnorm(10)
learning_rate <- function(t) .1 / t^(.6)
n_samp <- 2
for(t in 1:100000) {
mu_hat <- X %*% w
idx <- sample(1:N, n_samp)
X_batch <- X[idx,]
y_batch <- y[idx]
score_vec <- t(X_batch) %*% (y_batch - X_batch %*% w)
change <- score_vec * learning_rate(t)
w <- w + change
}
plot(mu_hat, ylim = c(-1, 1))
lines(mu)
fit_exact <- predict(lm(y ~ X - 1))
lines(fit_exact, col = 'red')
abs(w - coef(lm(y ~ X - 1)))
поскольку он, кажется, единственный, который работает с градиентным спусками с линейной регрессией с полиномиальными функциями.
Я считаю, что любой ортогональный многочлен (или, по крайней мере, ортонормированный) должен работать и давать hessian с условием номер 1, но я не могу заставить его работать на python. Связанный с этим вопрос: Как использовать полиномы Эрмита со стохастическим градиентным спуском (SGD)?