- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组参数,我手动(我希望它是手动的)使用 PolynomialFeatures 安装伪逆函数:
poly_feat = PolynomialFeatures(degree=Degree_mdl)
Kern_train = poly_feat.fit_transform(X_train)
c_pinv = np.dot(np.linalg.pinv( Kern_train ),Y_train)
然后我得到了一些多元多项式,我在 sympy 的帮助下使用 poly 对其进行了简化类和 coeffs()
函数。不过,coeffs 函数表示它按lex 顺序 返回非零系数。因此,我只想知道如何让 PolynomialFeatures 的顺序与上面的相匹配,这样我就可以在需要时逐项比较系数。
有人知道如何匹配两者的顺序以便可以进行比较吗?
通过查看 mathematica documentation,我确实知道字典顺序意味着什么我认为这对我来说很直观(基本上词典顺序是由单项式的度数完成的,所以 xy x^2 和 y^2 都具有相同的顺序并且比 x 或 y 等任何度数都“大”)。但是,我认为归结起来的细节是找出 sympy 与 PolynomialFeatures 如何排序。 Sympy 说它按字典顺序排序,但是当我检查我的多项式时,它似乎不符合我预期的顺序(虽然 PolyFeatures 确实遵守某些顺序,但当它有多个相同顺序的项时,我会以某种未知的方式中断死亡,例如x^2y, xy^2, y^2).所以这就是我检查 sympy 时出现的结果:
(Pdb) s_expr
Poly(-4.92243832500572e-13*x1**3 - 3.86418002630562e-13*x1**2*x2 - 284.848327636719*x1**2 - 1.97301728991142e-13*x1*x2**2 - 11.1939144134521*x1*x2 + 66.1333587984857*x1 - 1.35329085177577e-13*x2**3 - 108.171173095703*x2**2 + 28.227414137076*x2 - 11.0110442095318, x1, x2, domain='RR')
(Pdb) s_expr.coeffs()
[-4.92243832500572e-13, -3.86418002630562e-13, -284.848327636719, -1.97301728991142e-13, -11.1939144134521, 66.1333587984857, -1.35329085177577e-13, -108.171173095703, 28.2274141370760, -11.0110442095318]
(Pdb) s_expr.coeffs()[::-1]
[-11.0110442095318, 28.2274141370760, -108.171173095703, -1.35329085177577e-13, 66.1333587984857, -11.1939144134521, -1.97301728991142e-13, -284.848327636719, -3.86418002630562e-13, -4.92243832500572e-13]
这是我检查 PolynomailFeatures 时出现的结果:
>>> xx
array([[2, 3]])
>>> poly_feat.fit_transform(xx)
array([[ 1., 2., 3., 4., 6., 9., 8., 12., 18., 27.]])
# maps to the following ordering:
## [1,x1,x2,x1^2,x1x2,x2^2,x1^3,x1^2x2,x1x2^2,x2^3]
所以现在我正在寻找这些,想知道如何让它们具有完全相同的顺序,包括当单项式具有相同顺序时。任何想法都会很有帮助。
我看过他们的源代码,但我无法完全消化它以了解发生了什么(特别是在 sympy 方面)。任何帮助表示赞赏!
我只处理了 3 阶和 2 阶输入维度的示例,但如果它适用于任意输入和阶数,那就太好了。
赏金部分:用 3 级工作(我希望更高)制作 3 维
我已尝试使维度 3 和度数 3 的系数匹配,但由于某些原因它们不匹配。 PolyFeatures 似乎没有使用 grevlex
、grlex
中的任何一个,如果有人知道如何制作它,我很想听听。如果输入 [x3,x2,x1] = [5,3,2]
,我使多项式的系数与该单项式的值相匹配,例如 的系数>x3**2
的系数为 25
或者 x2*x3**2
的系数为 75
。所以我得到的输出是:
x_poly_feat_list = [1, 2, 3, 5, 4, 6, 10, 9, 15, 25, 8, 12, 20, 18, 30, 50, 27, 45, 75, 125]
poly = Poly(125*x3**3 + 75*x3**2*x2 + 50*x3**2*x1 + 25*x3**2 + 45*x3*x2**2 + 30*x3*x2*x1 + 15*x3*x2 + 20*x3*x1**2 + 10*x3*x1 + 5*x3 + 27*x2**3 + 18*x2**2*x1 + 9*x2**2 + 12*x2*x1**2 + 6*x2*x1 + 3*x2 + 8*x1**3 + 4*x1**2 + 2*x1 + 1, x3, x2, x1, domain='ZZ')
c_grevlex = [1, 2, 3, 5, 4, 6, 10, 9, 15, 25, 8, 12, 20, 18, 30, 50, 27, 45, 75, 125]
c_grlex = [1, 2, 3, 5, 4, 6, 9, 10, 15, 25, 8, 12, 18, 27, 20, 30, 45, 50, 75, 125]
len(c_grlex) 20
len(c_grevlex) 20
len(x_poly_feat_list) 20
all_match_grlex = False
all_match_grevlex = False
这意味着它不匹配。
完整代码:
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
from sympy import *
# nb monomials (n+d,d), d=degree, n=# of inputs
def check(n,d,user_array=None):
if user_array is None:
x = np.arange(2,2+n).reshape(1,n) # e.g. array([[2, 3]])
else:
x = user_array.reshape(1,n)
#x = np.arange(2,2+n).reshape(1,n) # e.g. array([[2, 3]])
print('x = ', x)
##
poly_feat = PolynomialFeatures(d)
x_poly_feat = poly_feat.fit_transform(x)
##
x_poly_feat_list = [ int(i) for i in x_poly_feat[0]]
#print('x_poly_feat = ', x_poly_feat)
#print('x_poly_feat = ', list(x_poly_feat[0]))
print('x_poly_feat_list = ', x_poly_feat_list)
return x_poly_feat_list
def check_sympy_degree():
x3,x2,x1 = symbols('x3 x2 x1')
poly = Poly( 125*x3**3 + 75*x2*x3**2 + 45*x2**2*x3 + 27*x2**3 + 50*x1*x3**2 + 30*x1*x2*x3 + 18*x1*x2**2 + 20*x1**2*x3 + 12*x1**2*x2
+ 8*x1**3 + 25*x3**2 + 15*x2*x3 + 9*x2**2 + 10*x1*x3 + 6*x1*x2 + 4*x1**2 + 2*x1 + 3*x2 + 5*x3 + 1,(x3,x2,x1) )
c_grevlex = poly.coeffs(order='grevlex')
c_grlex = poly.coeffs(order='grlex')
print('poly = ',poly)
print('c_grevlex = ', c_grevlex[::-1])
print('c_grlex = ', c_grlex[::-1])
return c_grlex, c_grevlex
if __name__ == '__main__':
#check(n=2,d=3)
##
x_poly_feat_list = check(n=3,d=3,user_array=np.array([2,3,5]))
##
c_grlex, c_grevlex = check_sympy_degree()
print('len(c_grlex)',len(c_grlex))
print('len(c_grevlex)',len(c_grevlex))
print('len(x_poly_feat_list)',len(x_poly_feat_list))
all_match_grlex = all( c_grlex[i] == x_poly_feat_list for i in range(len(x_poly_feat_list)) )
all_match_grevlex = all( c_grevlex[i] == x_poly_feat_list for i in range(len(x_poly_feat_list)) )
print('all_match_grlex = ',all_match_grlex)
print('all_match_grevlex = ',all_match_grevlex)
最佳答案
因此,单项式的 PolynomialFeatures 顺序如下:
1 + 2*x1 + 3*x2 + 4*x1**2 + 5*x1*x2 + 6*x2**2 + 7*x1**3 + 8*x1**2*x2 + 9*x1*x2**2 + 10*x2**3
我们希望 SymPy 按所示顺序返回系数:1..10。
首先要意识到这不是字典顺序,而是分级(可能是相反的?)字典顺序(参见维基百科上的 Monomial order)。即,单项式首先按它们的总度数分开(即分级),然后在每个组中应用字典顺序。
SymPy 的方法 coeffs
支持命令 'lex'(词典顺序,默认)、'grlex'(分级词典)和 grevlex(反向分级词典)。但是,为了产生我们想要的结果,有必要进行两项调整:
(x2, x1)
。coeffs
反转系数列表。这两个调整的综合效果是将较小的总度放在第一位,同时保持相同总度的单项式之间的顺序。
示例:
q = Poly(1 + 2*x1 + 3*x2 + 4*x1**2 + 5*x1*x2 + 6*x2**2 + 7*x1**3 + 8*x1**2*x2 + 9*x1*x2**2 + 10*x2**3, (x2, x1))
c = q.coeffs(order='grevlex')[::-1]
print(c)
这会打印 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
重要提示:对于 1 和 2 变量,grlex 和 grevlex 是一致的。由于您的示例包含 2 个变量,因此我不知道“grevlex”或“grlex”一般是否正确;我凭直觉使用了“grevlex”,但您应该使用包含 2 个以上变量的多项式对其进行测试。
关于python - 如何按词典顺序组织 PolynomialFeatures 的系数,以便它们与多元多项式的 sympy 匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46385303/
我正在使用 sklearn 的 PolynomialFeatures 将数据预处理为各种程度的变换,以便比较它们的模型拟合度。下面是我的代码: from sklearn.linear_mode
import os import pandas as pd import matplotlib.pyplot as plt from sklearn.pipeline import Pipeline
在 sklearn 的多项式特征方面需要帮助。它适用于一个功能,但每当我添加多个功能时,它还会在数组中输出一些值,除了提升到度数的值之外。例如:对于这个数组, X=np.array([[230.1,3
我有以下模型,它缩放数据,然后使用多项式特征,最后将数据输入具有正则化的回归模型,如下所示: X_train, X_test, y_train, y_test = train_test_split(X
我不明白为什么 scikit 的 PolynomialFeatuers 次数的输出总是为 1。 以 Degree=2 和 [a, b] 为例,输出为 [1, a, b, a^2, b^2, ab] 我
我有一个数据集 X,其形状为 (1741, 61)。使用带有 cross_validation 的逻辑回归,每次分割得到的结果约为 62-65% (cv =5)。 我认为如果我对数据进行二次方处理,准
在一本书中,我找到了以下代码,它适合二次数据的线性回归: m = 100 X = 6 * np.random.rand(m, 1) - 3 y = 0.5 * X**2 + X + 2 + np.ra
如果我有中等数量的基本特征,并从中生成中等阶的多项式特征,那么要知道特征数组 preprocess_XX 的哪一列对应于哪个转换可能会有点困惑的基本特征。 我曾经用旧版本的 sklearn(可能是 0
我有一组参数,我手动(我希望它是手动的)使用 PolynomialFeatures 安装伪逆函数: poly_feat = PolynomialFeatures(degree=Degree_mdl)
TLDR:如何从 sklearn.preprocessing.PolynomialFeatures() 函数获取输出 numpy 数组的 header ? 假设我有以下代码... import pan
我无法在 ipython 笔记本中导入以下模块: from sklearn.preprocessing import PolynomialFeatures from sklearn.pipeline
对于 MRE: m = 100 X = 6*np.random.rand(m,1)-3 y = 0.5*X**2 + X+2 + np.random.randn(m,1) lin_reg = Line
我是一名优秀的程序员,十分优秀!