首先让我澄清一下这段代码的目的:
我需要找到一个矩阵W,它将乘以一个向量X. WX(乘法的结果)将乘以一个矩阵Y.最后一次乘法(YWX)的结果应尽可能与a相似。矢量Z。
因此,我有X,Y和Z,并且需要找到最大化相似性的矩阵W.据我所知,我的相似性功能完美无缺;问题出在choose_w里面的循环中。
现在让我引导您完成choose_w代码:
我创建了一个零(v x v)矩阵w(v是一个参数)。然后我为找到的最佳矩阵创建一个控件,称为best_w(最初等于零矩阵)。我创建了一个名为best_sim的变量,并将其设置为-1,因为这是两个向量可能具有的最低可能性。
然后我创建一个for循环,运行len(np.diag(w))次。也就是说,它运行的次数等于矩阵对角线的长度。
在循环中,我创建了一个名为cont的变量,并将其设置为True。当cont为True时,w的第i行和第i列中的项(即w的对角线中的项)将增加0.1。
我调用相似度函数来评估此更改的结果。如果新相似度(new_sim)大于当前best_sim,则best_w成为当前w,best_sim成为当前new_sim。
否则(如果更改没有产生更大的相似性),我将变量cont更改为False。 while循环应该停止。
import numpy as np
from scipy import spatial
def similarity(w, x, y, z):
x = np.transpose(x)
z = np.transpose(z)
wx = np.dot(w,x)
ywx = np.dot(y,wx)
result = 1 - spatial.distance.cosine(z,ywx)
return result
def choose_w(v,x,y,z):
w = np.zeros((v,v))
best_w = w
best_sim = -1
for i in range(0,len(np.diag(w))):
cont = True
while cont:
w[i,i] += .1
new_sim = similarity(w,x,y,z)
if new_sim > best_sim:
best_w = w
best_sim = new_sim
print new_sim, best_sim
else:
cont = False
return best_w, best_sim
b = np.matrix([[1.0/3.0,1.0/3.0,1.0/3.0]],dtype=np.float)
c = np.matrix([[2,7,4],[0,1,5],[1,3,6]],dtype=np.float)
d = np.matrix([[1,1,1]],dtype=np.float)
choose_w(3,b,c,d)