Python R使用什么类型的正交多项式?
我试图匹配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中的等效语
X <- cbind(1, poly(x = x, degree = 9))
虽然它似乎不匹配。有人知道它使用的正交多项式的类型吗?我试图在文档中搜索,但没有说
为了提供一些上下文,我尝试在python()中实现以下R代码:
set.seed(1234)
Npoly
使用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