我确实试图在不同条件下为细胞的渗透性找到一个合适的函数。如果我假设渗透率恒定,我可以将其与实验数据拟合,并将Sklearns PolynomialFeatures
与LinearModel
一起使用(如本文所述),以确定条件与渗透率之间的相关性。然而,渗透率不是恒定的,现在我试图用渗透率作为工艺条件的函数来拟合我的模型。sklearn的PolynomialFeature
模块使用起来非常好。
scipy或numpy中是否有一个等效函数,允许我创建一个变阶多项式模型(包括交互项,如a*x[0]*x[1]
等),而无需手动编写整个函数?
numpy中的标准多项式类似乎不支持交互项。
我不知道有这样一个函数可以满足您的需求,但您可以使用itertools
和numpy
的组合来实现它。
如果您有n_features
预测变量,那么您基本上必须生成长度为n_features
的所有向量,这些向量的条目是非负整数,并按指定顺序求和。每个新的特征列都是使用这些向量的分量幂,这些向量按给定的顺序求和。
例如,如果order = 3
和n_features = 2
,则新特征之一将是提升到各自幂[2,1]
的旧特征。我在下面为任意顺序和数量的功能编写了一些代码。我修改了这篇文章中求和为order
的向量的生成。
import itertools
import numpy as np
from scipy.special import binom
def polynomial_features_with_cross_terms(X, order):
"""
X: numpy ndarray
Matrix of shape, `(n_samples, n_features)`, to be transformed.
order: integer, default 2
Order of polynomial features to be computed.
returns: T, powers.
`T` is a matrix of shape, `(n_samples, n_poly_features)`.
Note that `n_poly_features` is equal to:
`n_features+order-1` Choose `n_features-1`
See: https://en.wikipedia.org
/wiki/Stars_and_bars_%28combinatorics%29#Theorem_two
`powers` is a matrix of shape, `(n_features, n_poly_features)`.
Each column specifies the power by row of the respective feature,
in the respective column of `T`.
"""
n_samples, n_features = X.shape
n_poly_features = int(binom(n_features+order-1, n_features-1))
powers = np.zeros((n_features, n_poly_features))
T = np.zeros((n_samples, n_poly_features), dtype=X.dtype)
combos = itertools.combinations(range(n_features+order-1), n_features-1)
for i,c in enumerate(combos):
powers[:,i] = np.array([
b-a-1 for a,b in zip((-1,)+c, c+(n_features+order-1,))
])
T[:,i] = np.prod(np.power(X, powers[:,i]), axis=1)
return T, powers
以下是一些用法示例:
>>> X = np.arange(-5,5).reshape(5,2)
>>> T,p = polynomial_features_with_cross_terms(X, order=3)
>>> print X
[[-5 -4]
[-3 -2]
[-1 0]
[ 1 2]
[ 3 4]]
>>> print p
[[ 0. 1. 2. 3.]
[ 3. 2. 1. 0.]]
>>> print T
[[ -64 -80 -100 -125]
[ -8 -12 -18 -27]
[ 0 0 0 -1]
[ 8 4 2 1]
[ 64 48 36 27]]
最后,我应该提到的是,SVM多项式核在没有显式计算多项式映射的情况下恰恰达到了这种效果。这当然有赞成和反对之分,但我想我应该提到它,让你考虑一下,如果你还没有的话。