Skip to content

Commit ef0efa1

Browse files
mikhail-jnorvig
authored andcommitted
The function truncated_svd() should not return negative singular values. (aimacode#1059)
1 parent 6f15861 commit ef0efa1

File tree

2 files changed

+17
-11
lines changed

2 files changed

+17
-11
lines changed

learning.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,15 @@ def remove_component(X):
460460

461461
projected_X = matrix_multiplication(A, [[x] for x in X])
462462
projected_X = [x[0] for x in projected_X]
463-
eivals.append(norm(projected_X, 1)/norm(X, 1))
464-
eivec_m.append(X[:m])
465-
eivec_n.append(X[m:])
463+
new_eigenvalue = norm(projected_X, 1)/norm(X, 1)
464+
ev_m = X[:m]
465+
ev_n = X[m:]
466+
if new_eigenvalue < 0:
467+
new_eigenvalue = -new_eigenvalue
468+
ev_m = [-ev_m_i for ev_m_i in ev_m]
469+
eivals.append(new_eigenvalue)
470+
eivec_m.append(ev_m)
471+
eivec_n.append(ev_n)
466472
return (eivec_m, eivec_n, eivals)
467473

468474
# ______________________________________________________________________________

tests/test_learning.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -143,28 +143,28 @@ def test_truncated_svd():
143143
test_mat = [[17, 0],
144144
[0, 11]]
145145
_, _, eival = truncated_svd(test_mat)
146-
assert isclose(abs(eival[0]), 17)
147-
assert isclose(abs(eival[1]), 11)
146+
assert isclose(eival[0], 17)
147+
assert isclose(eival[1], 11)
148148

149149
test_mat = [[17, 0],
150150
[0, -34]]
151151
_, _, eival = truncated_svd(test_mat)
152-
assert isclose(abs(eival[0]), 34)
153-
assert isclose(abs(eival[1]), 17)
152+
assert isclose(eival[0], 34)
153+
assert isclose(eival[1], 17)
154154

155155
test_mat = [[1, 0, 0, 0, 2],
156156
[0, 0, 3, 0, 0],
157157
[0, 0, 0, 0, 0],
158158
[0, 2, 0, 0, 0]]
159159
_, _, eival = truncated_svd(test_mat)
160-
assert isclose(abs(eival[0]), 3)
161-
assert isclose(abs(eival[1]), 5**0.5)
160+
assert isclose(eival[0], 3)
161+
assert isclose(eival[1], 5**0.5)
162162

163163
test_mat = [[3, 2, 2],
164164
[2, 3, -2]]
165165
_, _, eival = truncated_svd(test_mat)
166-
assert isclose(abs(eival[0]), 5)
167-
assert isclose(abs(eival[1]), 3)
166+
assert isclose(eival[0], 5)
167+
assert isclose(eival[1], 3)
168168

169169

170170
def test_decision_tree_learner():

0 commit comments

Comments
 (0)