pythonの行列計算における-2乗あるいは**について
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