0

私は、これら 2 つのコードの効果的な違いは何かを理解しようとしていました。どちらも私が学校で受けた課題のために書かれていますが、最初のものだけが正常に機能します。2番目の問題で何がうまくいかないのか理解できなかったので、誰かがこの問題に光を当てることができれば非常に感謝しています.

最初のコード:

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

2 番目のコード:

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

2 番目は重みを変更しません。

最初に、重み配列を次の行で明示的に変更します

self.data_weights[index] = ...

しかし、2番目は変更するだけですw:

w *= ...

(そして、wの余分な要素があります)。2 番目のケースでは、w は から初期化された変数ですdata_weightsが、新しい変数です。これは配列エントリと同じではなく、その値を変更しても配列自体は変更されません。

そのため、後で 2 番目のケースを見に行くとdata_weights、更新されていません。

于 2013-11-25T16:42:41.377 に答える