Python R使用什么类型的正交多项式?

Python R使用什么类型的正交多项式?,python,r,machine-learning,gradient-descent,polynomial-math,Python,R,Machine Learning,Gradient Descent,Polynomial Math,我试图匹配R中以下代码中的正交多项式: X <- cbind(1, poly(x = x, degree = 9)) 虽然它似乎不匹配。有人知道它使用的正交多项式的类型吗?我试图在文档中搜索,但没有说 为了提供一些上下文,我尝试在python()中实现以下R代码: set.seed(1234) Npoly使用QR分解,如中所述 我认为您真正想要的是如何使用python复制R的poly的输出 在这里,我基于R的实现编写了一个函数来实现这一点。我还添加了一些注释,以便您可以看到R中的等效语

我试图匹配R中以下代码中的正交多项式:

X <- cbind(1, poly(x = x, degree = 9))
虽然它似乎不匹配。有人知道它使用的正交多项式的类型吗?我试图在文档中搜索,但没有说


为了提供一些上下文,我尝试在python()中实现以下R代码:

set.seed(1234)

N
poly
使用QR分解,如中所述

我认为您真正想要的是如何使用python复制R的
poly
的输出

在这里,我基于R的实现编写了一个函数来实现这一点。我还添加了一些注释,以便您可以看到R中的等效语句是什么样子的:

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],
与R中的相同操作相比

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

哦,哇,你链接了一篇很长的帖子。作为一个简单的问题,我认为使用像
qr
这样的因子分解会人为地降低多项式的阶数。我记得当我的学位比数据多时,我做了一个因式分解,它将我的数据矩阵
X
减少到了数据点的数量。你的方法也这样做吗?我真的不希望它这样做,我知道我有太多的度,我是故意这么做的,但即使我有太多的度/参数,我希望多项式仍然是正交的(不改变我的单项数是至关重要的)。你不能有比数据更多的度。我不确定我是否真的理解您的用例将如何需要它。但这可能是一个比这里更适合讨论的问题。你说不能讨论是什么意思?当然可以。只要选择高次多项式。我不是要你评估它的统计可靠性。我是问你建议的方法是否会影响我使用的单项式的数量。谢谢你的时间(顺便说一句!)我不是建议你应该使用哪种方法。您的问题是“R中的
poly
使用什么方法”和“如何在Python中获得相同的东西”?我想展示给大家看。R的算法能比数据拥有更多的度吗?尝试
poly(1:10,度=11)
自己看看。有关什么方法最适合您的特定应用程序的相关(但不同)问题的更详细建议,您将在交叉验证中获得更多的运气。这个网站在编程方面比较好,但在数学的基本问题上,你会得到更多专业知识的关注。两者和接口都是相同的LAPACK例程,所以我不确定为什么会有区别。但是如果numpy函数对您更有效,我将更新答案以使用它。
[-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