class TISP:
def __init__ (self, x, y, w, k, l, it):
#predict is a 2d list of observed values
#actual is a 1d list corresponding to a 0-1 value normalized
#and descriptive of each observations outcome
self.predicter = x
self.actual = y
self.normal_predicter = []
self.normal_actual = []
self.weights = w
self.kap = k
self.lam = l
self.iterations = it
return
def normalize_predicter (self):
#create a listed array of predicter, with each value replaced with
#z score from standardized collumn
#also cuts off first column
self.normal_predicter = []
nppredict = numpy.array(self.predicter)
nppredict_collumns = nppredict.T
nppredict_collumns = numpy.delete(nppredict_collumns, 0, 0)
for col in nppredict_collumns:
self.normal_predicter.append(scipy.stats.mstats.zscore(col, axis=0))
self.normal_predicter = numpy.array(self.normal_predicter).T
return
def normalize_actual (self):
self.normal_actual = []
npactual = numpy.array(self.actual)
self.normal_actual = scipy.stats.mstats.zscore(npactual)
return
def predicter_matrix (self):
#(I - 1/k^2 * X^t * X)
identity_n = self.normal_predicter.shape[1]
return numpy.identity(identity_n) - self.kap**-2 * numpy.dot(self.normal_predicter.T, self.normal_predicter)
def predicter_actual_matrix (self):
#1/k^2 * X^t * Y
return self.kap**-2 * numpy.dot(self.normal_predicter.T, self.normal_actual)
def pseudo_weights (self):
#theta on slides
return numpy.dot(self.predicter_matrix(), self.weights) + self.predicter_actual_matrix()
def adjust_lambda (self):
return self.lam * self.kap**-2
def hard_threshhold (self, pseudo_weight):
#put pseudo weights through hard threshhold
adj_lam = self.adjust_lambda()
if abs(pseudo_weight) < adj_lam:
return adj_lam**2 - (abs(pseudo_weight) - adj_lam)**2
else:
return adj_lam**2
def update_weights (self):
#update weights, call all
weights = []
for col, pw in enumerate(self.pseudo_weights()):
weights.append(self.hard_threshhold(pw))
self.weights = weights
return
def run_all (self):
self.normalize_all()
for i in range(self.iterations):
self.update_weights()
print self.weights
return
我省略了规范化功能,但是他们设置了属性,似乎工作正常。
obs 0的前几个列:
1,-0.0057548,-0.13457,0.027341,-0.23031,-0.25396,-0.084033,0.50101,-0.15747,-0.20175,0.027615,-0.24926,0.0090723,-0.056621,-0.10185,0.028461,0.1346
我正在实现一个名为tisp的阈值算法。
从权重的零开始,我第一次更新到其他一些低权重:
[0.0004,0.0004,0.0004,0.00020879693209322012,0.0004,0.00010554674122089871,0.0002128103652660953,0.00018560221711856617,0.00020718718704488368,0.00025472546603877807,0.0004,0.00032653814690485235,0.00028773649339636052,0.00014511605239718185,0.00026039641181569817,0.00032812782641074132,0.00010513077856280048,0.00020507079525590476,0.0002843078256187282,0.00018170990580009818]
然而,随着它不断进步,它将不再改变(我正在运行10次迭代)。
导致这种情况的原因是什么?