Repository navigation
Expand file tree
/
Copy pathKernelFile.py
More file actions
executable file
·161 lines (114 loc) · 5.32 KB
/
Copy pathKernelFile.py
File metadata and controls
executable file
·161 lines (114 loc) · 5.32 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.metrics.pairwise import linear_kernel, polynomial_kernel, rbf_kernel, laplacian_kernel, sigmoid_kernel
from sklearn.preprocessing import normalize
class kernelWrapper:
def __init__(self, Xtr_list, Ktype_list, config, normalize = False):
self.Xtr_list = Xtr_list
self.Ktype_list = Ktype_list
self.config = config
self.normalize = normalize
self._k_list = []
for dataset_index, Xtr in enumerate(Xtr_list):
for kernel_index, Ktype in enumerate(Ktype_list):
if len(Xtr_list) > 1:
self._k_list.append(kernel(Xtr, Ktype, config[dataset_index][kernel_index], normalize = self.normalize))
else:
self._k_list.append(kernel(Xtr, Ktype, config[kernel_index], normalize = self.normalize))
def kernelMatrix(self, X_list):
num_datasets = len(X_list)
if num_datasets != len(self.Xtr_list):
raise Exception("X_list and Xtr_list length differs: # datasets not the same")
self.kernelMatrix_list_ = []
for dataset_index, X in enumerate(X_list):
for kernel_index, Ktype in enumerate(self.Ktype_list):
self.kernelMatrix_list_.append(self._k_list[kernel_index+dataset_index*len(self.Ktype_list)].kernelMatrix(X))
return self
def predict(self, Xts_list, weights, tr_label, estimator, Ptype = 'classification'):
k_test_list = self.kernelMatrix(Xts_list).kernelMatrix_list_
K_eta = sum(eta*X for eta, X in zip(weights, k_test_list))
K_eta_c = estimator.centeredKernel(K_eta)
if Ptype == 'classification':
pred = np.zeros(k_test_list[0].shape)
for idx, row in enumerate(K_eta_c):
pred[idx, :] += np.multiply(row, tr_label)
return np.sign(np.sum(pred, axis = 1))
else:
pred = np.zeros(K_eta_c.shape[0])
for idx, row in enumerate(K_eta_c):
pred[idx] += np.dot(row, tr_label)
return pred
def getConfig(self):
config = {}
for k in self._k_list:
try:
config[k.K_type].append(k.param)
except:
config[k.K_type] = []
config[k.K_type].append(k.param)
return config
def printConfig(self):
strOut = ""
for k_idx, kernel in enumerate(self._k_list):
if k_idx%len(self.Ktype_list)==0 and k_idx!=0: strOut+="]\n"
if k_idx%len(self.Ktype_list)==0: strOut+="["
strOut += kernel.K_type+":"+str(kernel.param)+", "
return strOut+"]\n"
class kernel:
def __init__(self, X, K_type, param = None, normalize = False): #param = degree or sigma
if param==None: raise ValueError("Kernel parameter not set properly")
self.Xtr = X
self.K_type = K_type
self.param = param
self.normalize = normalize
if K_type == 'linear':
self_mu = None
def kernelMatrix(self, X, y = None):
if self.K_type == 'linear':
"""
if y != None:
if self.mu == None:
reg = Lasso(self.param) #TODO change with a model for classification and let the possibility to specify regression or classification
self_mu = reg.fit(X, y).coef_
self.Xtr = self.Xtr[:, mp.where(self_mu != 0)]
self.X = self.X[:, mp.where(self_mu != 0)]
"""
if self.normalize:
self.K = normalize(linear_kernel(X,self.Xtr))
else:
self.K = linear_kernel(X,self.Xtr)
return self.K
if self.K_type == 'polynomial':
if self.normalize:
self.K = normalize(polynomial_kernel(X, self.Xtr, degree=self.param))
else:
self.K = polynomial_kernel(X, self.Xtr, degree=self.param)
return self.K
if self.K_type == 'gaussian':
if self.normalize:
self.K = normalize(rbf_kernel(X, self.Xtr, gamma=self.param))
else:
self.K = rbf_kernel(X, self.Xtr, gamma=self.param)
return self.K
if self.K_type == 'laplacian':
if self.normalize:
self.K = normalize(laplacian_kernel(X, self.Xtr, gamma=self.param))
else:
self.K = laplacian_kernel(X, self.Xtr, gamma=self.param)
return self.K
if self.K_type == 'sigmoid':
if self.normalize:
self.K = normalize(sigmoid_kernel(X, self.Xtr, gamma=self.param))
else:
self.K = sigmoid_kernel(X, self.Xtr, gamma=self.param)
return self.K
def getType(self):
return self.K_type
def getParam(self):
return self.param
def setParam(self, param):
self.param = param
def getMatrix(self):
return self.Xtr
def getKernelMatrix(self):
return self.K