- Notifications
You must be signed in to change notification settings - Fork 296
/
Copy pathsvd_test.py
70 lines (53 loc) · 1.71 KB
/
svd_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
fromassertpyimportassert_that
importnumpy
fromsvdimportsvd
EPSILON=1e-9
deftest_reconstruct_matrix_from_svd():
matrix=numpy.array([
[2, 5, 3],
[1, 2, 1],
[4, 1, 1],
[3, 5, 2],
[5, 3, 1],
[4, 5, 5],
[2, 4, 2],
[2, 2, 5],
], dtype='float64')
singular_values, us, vs=svd(matrix)
singular_value_matrix=numpy.diag(singular_values)
reconstructed_matrix=numpy.dot(
us, numpy.dot(singular_value_matrix, vs))
flattened_original=matrix.flatten()
flattened_actual=reconstructed_matrix.flatten()
for (a, b) inzip(flattened_actual, flattened_original):
assert_that(a).is_close_to(b, EPSILON)
deftest_svd_of_transpose():
matrix=numpy.array([
[2, 5, 3],
[1, 2, 1],
[4, 1, 1],
[3, 5, 2],
[5, 3, 1],
[4, 5, 5],
[2, 4, 2],
[2, 2, 5],
], dtype='float64').T
singular_values, us, vs=svd(matrix)
singular_value_matrix=numpy.diag(singular_values)
reconstructed_matrix=numpy.dot(
us, numpy.dot(singular_value_matrix, vs))
flattened_original=matrix.flatten()
flattened_actual=reconstructed_matrix.flatten()
for (a, b) inzip(flattened_actual, flattened_original):
assert_that(a).is_close_to(b, EPSILON)
deftest_1_by_1():
matrix=numpy.array([[2]], dtype='float64')
singular_values, us, vs=svd(matrix)
assert_that(singular_values).is_equal_to([2])
assert_that(us).is_length(1)
assert_that(vs).is_length(1)
ifus[0] == [-1.0]:
assert_that(vs[0]).is_equal_to([-1.0])
else:
assert_that(us[0]).is_equal_to([1.0])
assert_that(vs[0]).is_equal_to([1.0])