我有一个函数可以计算两个元素之间调整后的余弦相似度,类似于:
def sim(x,y,M):
filtered = M[(M[:, x] > 0) & (M[:, y] > 0)]
m = np.average(filtered, axis=1, weights=filtered.astype(bool))
i = filtered[:, x] - m
j = filtered[:, y] - m
return np.sum(i * j) / (np.linalg.norm(i) * np.linalg.norm(j))
我还有一个n * n矩阵,我想为每一对得到sim(),即0,0-n,n。 目前我正在使用两个for循环来做这个,它运行良好,但它很慢:
def get_matrix(M):
new_mat = []
for x in range(3):
for y in range(3):
new_mat.append(sim(x,y,M))
return np.reshape(new_mat, (3,3))
有更有效的方法吗? M( mn )和mat( nn )的尺寸不同。
编辑:
My M看起来像这样:
[[ 0. 100. 300.]
[ 100. 200. 0.]
[ 250. 150. 0.]
[ 250. 200. 0.]]
作为输出,我希望在这种情况下需要一个大小为3x3的矩阵(new_mat),它包含每个项目之间的相似性,简化:
[[ 1. -1. -1.]
[ -1. 1. -1.]
[ -1. -1. 1.]]