Python 张量乘子阵

Python 张量乘子阵,python,numpy,machine-learning,math,probability,Python,Numpy,Machine Learning,Math,Probability,我试图实现一个多元高斯混合模型,并试图用张量计算概率分布函数。有n个数据点、k个簇和d维。到目前为止,我有两个张量。一个是中心数据点的(n,k,d)张量,另一个是协方差矩阵的kxd张量。我可以通过这样做来计算一个nxk概率矩阵 centered = np.repeat(points[:,np.newaxis,:],K,axis=1) - mu[np.newaxis,:] # KxNxD prob = np.zeros(n,k) constant = 1/2/np.pow(np.pi, d/2)

我试图实现一个多元高斯混合模型,并试图用张量计算概率分布函数。有n个数据点、k个簇和d维。到目前为止,我有两个张量。一个是中心数据点的
(n,k,d)
张量,另一个是协方差矩阵的
kxd
张量。我可以通过这样做来计算一个
nxk
概率矩阵

centered = np.repeat(points[:,np.newaxis,:],K,axis=1) - mu[np.newaxis,:] # KxNxD
prob = np.zeros(n,k)
constant = 1/2/np.pow(np.pi, d/2)
for n in range(centered.shape[1]):
    for k in range(centered.shape[0]):
        p = centered[n,k,:][np.newaxis] # 1xN
        power = -1/2*(p @ np.linalg.inv(sigma[k,:,:]) @ p.T)
        prob[n,k] = constant * np.linalg.det(sigma[k,:,:]) * np.exp(power)

其中,
sigma
是三角化的
kxdxd
协方差矩阵,
居中
是mypoints。使用numpy的张量能力做这件事的一种更具Python风格的方法是什么?

只需几个快速观察:

  • 我没有看到你在循环中使用
    p
    ;这是个错误吗?是否改为使用
    n

  • 中的
    T
    以[n,k,:]为中心;使用该索引,数组为1d

  • 我不确定
    np.linal.inv
    是否可以处理成批的数组,允许
    np.linal.inv(sigma)

  • @
    允许批量,只要最后2个dim是进入
    点的dim(使用通常的
    A的最后一个,B的第二个到最后一个
    规则;
    einsum
    也可以使用

  • 同样,
    np.linalg.det
    是否处理批次


对此非常抱歉,我打算让代码更像伪代码,而不是实际运行的代码。我已经修复了它以使其更有意义。是的,
np.linalg.det
np.linalg.inv
处理批处理,我得到每个批的所需值。对于
cov_inv
kxd
矩阵,其中
dxd
子逆矩阵和
cov_det
是长度
k
的向量,其中每个值对应于
sigma
dxd
矩阵的行列式