Python 张量乘子阵
我试图实现一个多元高斯混合模型,并试图用张量计算概率分布函数。有n个数据点、k个簇和d维。到目前为止,我有两个张量。一个是中心数据点的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)
张量,另一个是协方差矩阵的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
中的
以[n,k,:]为中心;使用该索引,数组为1dT
- 我不确定
是否可以处理成批的数组,允许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
矩阵的行列式