https://github.com/romi1502/NMF-matlab/blob/master/python/NMF.py

こちらのプログラムを参考にPython2.7.15にてbeta-divergenceのbeta=2の場合のプログラムを作成しています.

(正しくは,プログラムを作成中,これのbeta=2であることが分かった)

W*= (np.dot((Lambda**(beta-2.0)*V), H.T) + eps)/(np.dot(Lambda**(beta-1), H.T) + eps);

こちらのプログラムの式は正方行列でない行列に対してA**-2のようなことは出来ません.

これを実現する方法はNumPyにありますでしょうか?

回答,お導きのほどよろしくお願いいたします.

作成したプログラム

def factorizeIS(A,dim=10,iteration_num=100,seed=0):
dim_row,dim_column=shape(A)

random.seed(seed)
U=matrix([[random.random() for j in range(dim)] for i in range(dim_row)])
V=matrix([[random.random() for j in range(dim_column)] for i in range(dim)])

eps = spacing(1)

for i in range(iteration_num):
    cost=ISdivergence(A,U.dot(V))
    if i%10==0: print cost
    if cost==0: break

    UV = U.dot(V)
    U= (dot((UV**(-2)*A), V.T) + eps)/(dot(UV**(-1), V.T) + eps)

    UV = dot(U,V) + eps;
    V*= (dot(U.T, UV**(-2)*A) + eps)/(dot(U.T, UV**(-1)) + eps)

return normalize_V(U,V)

このプログラムを,以下でテストしています

def k6_3_IS():
A = matrix([ [1,1,2,1,3] , [2,3,3,4,4] , [1,1,2,1,3] , [1,2,1,3,1] ])
U,V = factorizeIS( A , dim=2 , iteration_num=1000 , seed=0 )
print( "U*V" )
print( U.dot(V) )

エラー全文

Traceback (most recent call last):
  File "k6.py", line 65, in <module>
    k6_3_IS()
  File "k6.py", line 42, in k6_3_IS
    U,V = factorizeIS( A , dim=2 , iteration_num=1000 , seed=0 )
  File ********\nmf.py", line 148, in factorizeIS
    U= (dot((UV**(-2)*A), V.T) + eps)/(dot(UV**(-1), V.T) + eps)
  File ********\numpy\matrixlib\defmatrix.py", line 228, in __pow__
    return matrix_power(self, other)
  File ********\numpy\linalg\linalg.py", line 602, in matrix_power
    _assertNdSquareness(a)
  File ********\numpy\linalg\linalg.py", line 215, in _assertNdSquareness
    raise LinAlgError('Last 2 dimensions of the array must be square')
numpy.linalg.linalg.LinAlgError: Last 2 dimensions of the array must be square