python पहच आर किस प्रकार के ऑर्थोगोनल बहुपदों का उपयोग करता है?



शून्य बहुपद की परिभाषा (1)

poly क्यूआर कारककरण का उपयोग करता है, जैसा कि इस उत्तर में कुछ विस्तार से वर्णित है।

मुझे लगता है कि आप वास्तव में जो खोज रहे हैं वह है कि पाइथन का उपयोग करके आर के poly के आउटपुट को दोहराना है।

यहां मैंने आर के कार्यान्वयन के आधार पर ऐसा करने के लिए एक समारोह लिखा है। मैंने कुछ टिप्पणियां भी जोड़ दी हैं ताकि आप देख सकें कि आर में समकक्ष बयान क्या दिखते हैं:

import numpy as np

def poly(x, degree):
    xbar = np.mean(x)
    x = x - xbar

    # R: outer(x, 0L:degree, "^")
    X = x[:, None] ** np.arange(0, degree+1)

    #R: qr(X)$qr
    q, r = np.linalg.qr(X)

    #R: r * (row(r) == col(r))
    z = np.diag((np.diagonal(r)))  

    # R: Z = qr.qy(QR, z)
    Zq, Zr = np.linalg.qr(q)
    Z = np.matmul(Zq, z)

    # R: colSums(Z^2)
    norm1 = (Z**2).sum(0)

    #R: (colSums(x * Z^2)/norm2 + xbar)[1L:degree]
    alpha = ((x[:, None] * (Z**2)).sum(0) / norm1 +xbar)[0:degree]

    # R: c(1, norm2)
    norm2 = np.append(1, norm1)

    # R: Z/rep(sqrt(norm1), each = length(x))
    Z = Z / np.reshape(np.repeat(norm1**(1/2.0), repeats = x.size), (-1, x.size), order='F')

    #R: Z[, -1]
    Z = np.delete(Z, 0, axis=1)
    return [Z, alpha, norm2];

यह जांच कर रहा है कि यह काम करता है:

x = np.arange(10) + 1
degree = 9
poly(x, degree)

लौटा मैट्रिक्स की पहली पंक्ति है

[-0.49543369,  0.52223297, -0.45342519,  0.33658092, -0.21483446,
  0.11677484, -0.05269379,  0.01869894, -0.00453516],

आर में एक ही ऑपरेशन की तुलना में

poly(1:10, 9)
# [1] -0.495433694  0.522232968 -0.453425193  0.336580916 -0.214834462
# [6]  0.116774842 -0.052693786  0.018698940 -0.004535159

मैं आर में निम्नलिखित कोड में ऑर्थोगोनल बहुपदों से मिलान करने की कोशिश कर रहा था:

X <- cbind(1, poly(x = x, degree = 9))

लेकिन अजगर में।

ऐसा करने के लिए मैंने ऑर्थोगोनल बहुपदों को देने के लिए अपनी खुद की विधि लागू की:

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

हालांकि यह मैच नहीं लगता है। क्या कोई व्यक्ति ऑर्थोगोनल बहुपद का उपयोग करता है? मैंने प्रलेखन में खोज करने की कोशिश की लेकिन कहा नहीं।

कुछ संदर्भ देने के लिए मैं पाइथन में निम्नलिखित आर कोड को लागू करने की कोशिश कर रहा हूं ( https://stats.stackexchange.com/questions/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)))

क्योंकि यह एकमात्र ऐसा प्रतीत होता है जो बहुपद सुविधाओं के साथ रैखिक प्रतिगमन के साथ ढाल वंश के साथ काम करता है।

मुझे लगता है कि किसी भी ऑर्थोगोनल बहुपद (या कम से कम औपचारिक) को काम करना चाहिए और हालत नंबर 1 के साथ हेसियन देना चाहिए, लेकिन मुझे इसे अजगर में काम नहीं करना प्रतीत होता है। संबंधित प्रश्न: स्टोकास्टिक ग्रेडियेंट डेसेंट (एसजीडी) के साथ हरमीइट बहुपदों का उपयोग कैसे करता है?





polynomial-math