Python 如何实施sklearn';tensorflow中的s多项式特征?

Python 如何实施sklearn';tensorflow中的s多项式特征?,python,tensorflow,polynomial-math,keras-layer,Python,Tensorflow,Polynomial Math,Keras Layer,我正试图在tensorflow和Keras中将scikit learn作为前馈神经网络的一个层来实现。为了简单起见,我将给出一个使用NumPy数组的示例。如果一个批次有三个样品,且某一层的活化程度等于(3,2)型基质 >>> X = np.arange(0, 6).reshape(2, 3) >>> X array([[0, 1], [2, 3], [4, 5]]) 然后我希望下一层中的激活等于X的二次多项式特征展开: >&

我正试图在tensorflow和Keras中将scikit learn作为前馈神经网络的一个层来实现。为了简单起见,我将给出一个使用NumPy数组的示例。如果一个批次有三个样品,且某一层的活化程度等于(3,2)型基质

>>> X = np.arange(0, 6).reshape(2, 3)
>>> X
array([[0, 1],
       [2, 3],
       [4, 5]])
然后我希望下一层中的激活等于
X
的二次多项式特征展开:

>>> from sklearn.preprocessing import PolynomialFeatures
>>> PolynomialFeatures(degree=2).fit_transform(X)
array([[  1.,   0.,   1.,   0.,   0.,   1.],
       [  1.,   2.,   3.,   4.,   6.,   9.],
       [  1.,   4.,   5.,  16.,  20.,  25.]])
import keras.backend as K
X = K.reshape(K.arange(0, 6), (3, 2))
with K.get_session().as_default():
    print(K.concatenate([K.pow(X, 0), K.pow(X, 1), K.pow(X, 2)]).eval())
也就是说,如果层i的激活是矩阵
X
(形状
(批量大小,数量特征)
),那么对于参数选择
degree=2
,我希望层i+1的激活是

  • 一列
    batch\u size
    many
    1.
  • X
    本身
  • 以及
    X
    X[:,0]*X[:,0]
    X[:,0]*X[:,1]
    X[:,1]*X[:,1]
    的所有无序列对的元素乘积

  • 到目前为止,我最接近的解决方案是连接
    X的一些幂:

    >>> from sklearn.preprocessing import PolynomialFeatures
    >>> PolynomialFeatures(degree=2).fit_transform(X)
    array([[  1.,   0.,   1.,   0.,   0.,   1.],
           [  1.,   2.,   3.,   4.,   6.,   9.],
           [  1.,   4.,   5.,  16.,  20.,  25.]])
    
    import keras.backend as K
    X = K.reshape(K.arange(0, 6), (3, 2))
    with K.get_session().as_default():
        print(K.concatenate([K.pow(X, 0), K.pow(X, 1), K.pow(X, 2)]).eval())
    
    输出:

    [[ 1  1  0  1  0  1]
     [ 1  1  2  3  4  9]
     [ 1  1  4  5 16 25]]
    
    i、 例如,
    1
    s的两列(比我想要的多出一列,但我可以接受这种重复)、
    X
    本身和
    X
    平方元素


    有没有一种方法可以计算不同列的乘积(以自动微分的方式)?我不知道如何在tensorflow中实现的方法是用另一个矩阵的某些列的乘积(跨越
    axis=1
    )填充矩阵的一列:
    XP[:,I]=X[:,c]。prod(axis=1)
    ,其中
    c
    是一个索引元组,如
    (0,0,1)

    如果你构造了一个包含所有n个基本特征的向量v_1,并将该向量自身转化为一个向量,结果将是所有特征成对乘积的对称(n,n)矩阵M_2(对角线上有正方形)。您可以使用
    tensorflow\u probability.math.fill\u triangal\u inverse
    将唯一项的三角形切片提取到向量v\u 2中。然后,v_1和v_2的串联将作为多项式特征向量,最高可达二次。以下是仅具有两个特征尺寸的示例:

    v_1=(x,y)=> M_2=(xx,xy;yx,yy)=(x^2,xy;xy,y^2)=> v_2=(x^2,xy,y^2)

    通过将v_1增加为1,还可以在相同的输出中获得常量1和一阶值

    v_2和v_1的外积将返回一个矩形矩阵M_3,该矩阵包含具有重复项的立方项。可能有一些技巧可以过滤掉重复项,甚至可以推广到更高的d度。(生成外积d-立方体并提取广义三角形切片在我看来是一个低效的解决方案。)

    当然,通过其他方法可以使唯一多项式特征向量达到所需的阶数(即枚举有界基数的多个集合),但生成的特征的绝对数量将不可避免地变得难以管理/膨胀,除非输入维数n或阶数d非常小。(见附件)

    对于有限数量的多项式(或通用产品(xi^wi))特征,是否可以选择一个可培训的维度选择器?对于某些应用,Deepmind的NALU装置可能有用。他们能够学习加权加法和加权乘法(正数)

    提取有限数量多项式特征的另一种方法是堆叠形式为f(PI(wij*xj+bij))的乘法层(使用单位激活f),如我所述并由我自己实现(尚未完全测试)

    定义一种图层类型,该图层在堆叠时提供(有损)多项式特征提取。每一层基本上是将前一输出层元素的线性投影与初始输入相乘。它被证明是有用的