我试图理解这两段代码之间的有效区别。这两本书都是为我在学校的作业而写的,但只有第一本书是应该写的。我一直无法理解第二个问题出了什么问题,所以如果有人能对这个问题有所帮助,我会非常感激。你知道吗
第一个代码:
def classify(self, obj):
if sum([c[0].classify(obj)*c[1] for c in self.classifiers]) >0:
return 1
else: return -1
def update_weights(self, best_error, best_classifier):
w=self.data_weights
for index in range(len(self.data_weights)):
if self.standard.classify(self.data[index])==best_classifier.classify(self.data[index]):
s=-1
else: s=1
self.data_weights[index] = self.data_weights[index]*math.exp(s*error_to_alpha(best_error))
第二个代码:
def classify(self, obj):
score = 0
for c, alpha in self.classifiers:
score += alpha * c.classify(obj)
if score > 0:
return 1
else:
return -1
def update_weights(self, best_error, best_classifier):
alpha = error_to_alpha(best_error)
for d, w in zip(self.data, self.data_weights):
if self.standard.classify(d) == best_classifier.classify(d):
w *= w * math.exp(alpha)
else:
w *= w * math.exp(-1.0*alpha)
第二种方法不会修改权重。你知道吗
在第一种情况下,您可以显式地用线修改权重数组
但在第二种情况下,您只需要修改
w
:(还有一个额外的系数w)。在第二种情况下,w是从
data_weights
初始化的变量,但它是一个新变量。它与数组条目不同,更改其值不会更改数组本身。你知道吗因此,当您稍后查看第二种情况下的
data_weights
时,它不会被更新。你知道吗相关问题 更多 >
编程相关推荐