@@ -29,9 +29,10 @@ class SoftmaxRegressionLearner(Learner):
2929 parameters to be smaller.
3030
3131 preprocessors : list, optional
32- Preprocessors are applied to data before training or testing. Default preprocessors:
33- Defaults to
34- `[RemoveNaNClasses(), RemoveNaNColumns(), Impute(), Continuize(), Normalize()]`
32+ Preprocessors are applied to data before training or testing. Default
33+ preprocessors:
34+ `[RemoveNaNClasses(), RemoveNaNColumns(), Impute(), Continuize(),
35+ Normalize()]`
3536
3637 - remove columns with all values as NaN
3738 - replace NaN values with suitable values
@@ -52,53 +53,55 @@ def __init__(self, lambda_=1.0, preprocessors=None, **fmin_args):
5253 super ().__init__ (preprocessors = preprocessors )
5354 self .lambda_ = lambda_
5455 self .fmin_args = fmin_args
56+ self .num_classes = None
5557
56- def cost_grad (self , Theta_flat , X , Y ):
57- Theta = Theta_flat .reshape ((self .num_classes , X .shape [1 ]))
58+ def cost_grad (self , theta_flat , X , Y ):
59+ theta = theta_flat .reshape ((self .num_classes , X .shape [1 ]))
5860
59- M = X .dot (Theta .T )
61+ M = X .dot (theta .T )
6062 P = np .exp (M - np .max (M , axis = 1 )[:, None ])
6163 P /= np .sum (P , axis = 1 )[:, None ]
6264
6365 cost = - np .sum (np .log (P ) * Y )
64- cost += self .lambda_ * Theta_flat .dot (Theta_flat ) / 2.0
66+ cost += self .lambda_ * theta_flat .dot (theta_flat ) / 2.0
6567 cost /= X .shape [0 ]
6668
6769 grad = X .T .dot (P - Y ).T
68- grad += self .lambda_ * Theta
70+ grad += self .lambda_ * theta
6971 grad /= X .shape [0 ]
7072
7173 return cost , grad .ravel ()
7274
73- def fit (self , X , y , W ):
74- if len (y .shape ) > 1 :
75+ def fit (self , X , Y , W = None ):
76+ if len (Y .shape ) > 1 :
7577 raise ValueError ('Softmax regression does not support '
7678 'multi-label classification' )
7779
78- if np .isnan (np .sum (X )) or np .isnan (np .sum (y )):
80+ if np .isnan (np .sum (X )) or np .isnan (np .sum (Y )):
7981 raise ValueError ('Softmax regression does not support '
8082 'unknown values' )
8183
8284 X = np .hstack ((X , np .ones ((X .shape [0 ], 1 ))))
8385
84- self .num_classes = np .unique (y ).size
85- Y = np .eye (self .num_classes )[y .ravel ().astype (int )]
86+ self .num_classes = np .unique (Y ).size
87+ Y = np .eye (self .num_classes )[Y .ravel ().astype (int )]
8688
8789 theta = np .zeros (self .num_classes * X .shape [1 ])
8890 theta , j , ret = fmin_l_bfgs_b (self .cost_grad , theta ,
8991 args = (X , Y ), ** self .fmin_args )
90- Theta = theta .reshape ((self .num_classes , X .shape [1 ]))
92+ theta = theta .reshape ((self .num_classes , X .shape [1 ]))
9193
92- return SoftmaxRegressionModel (Theta )
94+ return SoftmaxRegressionModel (theta )
9395
9496
9597class SoftmaxRegressionModel (Model ):
96- def __init__ (self , Theta ):
97- self .Theta = Theta
98+ def __init__ (self , theta ):
99+ super ().__init__ ()
100+ self .theta = theta
98101
99102 def predict (self , X ):
100103 X = np .hstack ((X , np .ones ((X .shape [0 ], 1 ))))
101- M = X .dot (self .Theta .T )
104+ M = X .dot (self .theta .T )
102105 P = np .exp (M - np .max (M , axis = 1 )[:, None ])
103106 P /= np .sum (P , axis = 1 )[:, None ]
104107 return P
@@ -119,7 +122,6 @@ def numerical_grad(f, params, e=1e-4):
119122 return grad
120123
121124 d = Orange .data .Table ('iris' )
122- m = SoftmaxRegressionLearner (lambda_ = 1.0 )
123125
124126 # gradient check
125127 m = SoftmaxRegressionLearner (lambda_ = 1.0 )
@@ -132,11 +134,3 @@ def numerical_grad(f, params, e=1e-4):
132134
133135 print (ga )
134136 print (gn )
135-
136- # for lambda_ in [0.1, 0.3, 1, 3, 10]:
137- # m = SoftmaxRegressionLearner(lambda_=lambda_)
138- # scores = []
139- # for tr_ind, te_ind in StratifiedKFold(d.Y.ravel()):
140- # s = np.mean(m(d[tr_ind])(d[te_ind]) == d[te_ind].Y.ravel())
141- # scores.append(s)
142- # print('{:4.1f} {}'.format(lambda_, np.mean(scores)))
0 commit comments