0

我试图了解这两段代码之间的有效区别是什么。它们都是为我在学校得到的作业而写的,但只有第一个可以正常工作。我一直无法理解第二个出了什么问题,所以如果有人能对这个问题有所了解,我将非常感激。

第一个代码:

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)
4

1 回答 1

2

第二个不修改权重。

首先,您使用以下行显式修改权重数组

self.data_weights[index] = ...

但在第二个你只修改w

w *= ...

(你有一个额外的因素 w)。在第二种情况下, w 是一个从 初始化的变量data_weights,但它是一个新变量。它与数组条目不同,更改其值不会更改数组本身。

所以当你以后去查看data_weights第二种情况时,它不会被更新。

于 2013-11-25T16:42:41.377 回答