-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmySVD.py
110 lines (86 loc) · 3.41 KB
/
mySVD.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import os
import pickle
import numpy as np
import scipy as sp
from scipy.sparse import issparse, spdiags
from scipy.linalg import eig, eigh, svd
def mySVD(X, ReducedDim=0):
MAX_MATRIX_SIZE = 1600
EIGVECTOR_RATIO = 0.1
if not ReducedDim:
ReducedDim = 0
mFea, nSmp = X.shape
if nSmp/mFea > 1.0713:
ddata = X @ X.T
ddata = np.maximum(ddata, ddata.T)
dimMatrix = ddata.shape[0]
if (ReducedDim > 0) and (dimMatrix > MAX_MATRIX_SIZE) and (ReducedDim < dimMatrix*EIGVECTOR_RATIO):
eigvalue, U = eigh(ddata, eigvals=(dimMatrix - ReducedDim, dimMatrix - 1))
eigvalue = eigvalue[::-1]
U = U[:, ::-1]
else:
if issparse(ddata):
ddata = ddata.toarray()
eigvalue, U = eigh(ddata)
eigvalue = eigvalue[::-1]
U = U[:, ::-1]
eigIdx = np.where(np.abs(eigvalue) / np.max(np.abs(eigvalue)) < 1e-10)[0]
eigvalue = np.delete(eigvalue, eigIdx)
U = np.delete(U, eigIdx, axis=1)
if (ReducedDim > 0) and (ReducedDim < len(eigvalue)):
eigvalue = eigvalue[:ReducedDim]
U = U[:, :ReducedDim]
eigvalue_Half = np.sqrt(np.abs(eigvalue))
S = spdiags(eigvalue_Half, 0, len(eigvalue_Half), len(eigvalue_Half))
eigvalue_MinusHalf = eigvalue_Half ** -1
V = X.T @ (U * np.tile(eigvalue_MinusHalf, (U.shape[0], 1)))
else:
ddata = X.T @ X
ddata = np.maximum(ddata, ddata.T)
dimMatrix = ddata.shape[0]
if (ReducedDim > 0) and (dimMatrix > MAX_MATRIX_SIZE) and (ReducedDim < dimMatrix*EIGVECTOR_RATIO):
eigvalue, V = eigh(ddata, eigvals=(dimMatrix - ReducedDim, dimMatrix - 1))
eigvalue = eigvalue[::-1]
V = V[:, ::-1]
else:
if issparse(ddata):
ddata = ddata.toarray()
eigvalue, V = eigh(ddata)
eigvalue = eigvalue[::-1]
V = V[:, ::-1]
eigIdx = np.where(np.abs(eigvalue) / np.max(np.abs(eigvalue)) < 1e-10)[0]
eigvalue = np.delete(eigvalue, eigIdx)
V = np.delete(V, eigIdx, axis=1)
if (ReducedDim > 0) and (ReducedDim < len(eigvalue)):
eigvalue = eigvalue[:ReducedDim]
V = V[:, :ReducedDim]
eigvalue_Half = eigvalue**0.5
S = spdiags(eigvalue_Half,0,len(eigvalue_Half),len(eigvalue_Half))
eigvalue_MinusHalf = eigvalue_Half**-1
U = X.dot(V * np.tile(eigvalue_MinusHalf.T,(V.shape[0],1)))
return (U, S, V)
if __name__ == '__main__':
DATA_FOLDER = "P:/RESEARCH/DATA/CIFAR-100/CIFARDB/train/"
features = pickle.load(open("./database/features_YCrCb_CifarDataset.pkl", 'rb'))
paths = pickle.load(open("./database/paths_YCrCb_CifarDataset.pkl", 'rb'))
features = features
paths = paths
classes = os.listdir(DATA_FOLDER)
X = np.array(features)
y = []
class_check = 'apple'
for path in paths:
label = 0
if class_check in path:
label = 1
y.append(label)
y = np.array(y)
X = X.T
y = y.reshape(-1, 1)
print(X.shape)
print(y.shape)
# ====================================
U, S, V = mySVD(X, ReducedDim=100)
print("Size of U = ", U.shape)
print("Size of S = ", S.shape)
print("Size of V = ", V.shape)