0

したがって、放射基底関数を少し速く実行する必要があります

    while(error):
        epoch += 1
        error = 0
        for i in xrange(self.numPoints):
            dp = self.dotProduct(g[i], self.weights)
            signum = self.sig(dp)
            if dp < 0 and g[i].classification == 1:
                self.updateWeights(signum, g[i])
                error += 1
            elif dp > 0 and g[i].classification == -1:
                self.updateWeights(signum, g[i])
                error += 1
            elif dp == 0:
                self.updateWeights(signum, g[i])
                error += 1
        if epoch > 10000:
            return 0
    print "Epochs %i, %i Dimensions" % (epoch, self.numWeights - 1)
    return 1

def dotProduct(self, x, y):
    ret = 0.0
    for i in xrange(len(y)):
        ret += x.points[i]*y[i]
    return ret

def sig(self, x):
    if x < 0:
        return 1
    if x > 0:
        return -1
    else:
        return 0

def updateWeights(self, s, g):
    for i in xrange(self.numWeights):
        self.weights[i] = self.weights[i] + self.learningRate * s * g.points[i]

並行スレッドを使用したかったのですが、Python スレッド化は前のスレッドが終了するまでスレッドをロックするため、単一のメイン スレッドを実行するよりも速くなりません。

for i in xrange(self.numPoints): ただし、self.weights の値をロックすると、一度に 1 つのスレッドしか値を変更できなくなります。

これをどのように行うことができるか、誰にもアイデアがありますか?

これは小さなデータセットではうまく機能しますが、実際のデータを使用すると少し面倒になります

4

2 に答える 2

2

numpy 配列を使用してパフォーマンスを向上させることができます。

import numpy as np

def dotProduct(self, x, y):
    return np.dot(x.point, y)

def updateWeights(self, s, g):
    self.weights += self.learningRate * s * g.points

ここx.pointy、、、、self.weightsは1 次元のg.pointsnumpy 配列です。

于 2013-03-03T15:19:09.597 に答える
0

Python マルチスレッドは、1 つの CPU コア上の単一プロセスですべてのスレッドを実行します。

真の並列スレッドを実行するには、マルチプロセッシングライブラリを使用する必要があります。

于 2013-03-03T11:55:46.077 に答える