def f(self, X, W):
"""Function value.
"""
X_ = list(X)
n = len(X_)
K = W[0].shape[1] # The number of components
f = 0.0
for k in range(K):
for i in range(n):
wik = W[i][:, [k]]
for j in range(n):
if self.pred_comp[i][j] > 0:
wjk = W[j][:, [k]]
ti = np.dot(X_[i], wik)
tj = np.dot(X_[j], wjk)
f += np.asscalar(np.dot(ti.T, tj))
# Deflate for next component
if k < K - 1: # Do not deflate for last component
for i in range(n):
wi = W[i][:, k]
ti = np.dot(X_[i], wi)
titi = np.asscalar(np.dot(ti.T, ti))
if titi > consts.TOLERANCE:
pi = np.dot(X_[i].T, ti) / titi
X_[i] = X_[i] - np.dot(ti, pi.T) # Deflate
# else:
# pi = np.zeros_like(wi)
return f
评论列表
文章目录