为什么这个循环没有停止?

时间:2016-10-01 14:04:45

标签: python numpy matrix scipy matrix-multiplication

首先让我澄清一下这段代码的目的:

我需要找到一个矩阵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) 

0 个答案:

没有答案