1

最初にお読みください: 問題は、絶対値の括弧が実際のスコアを囲む必要があるということでした。現在の問題は、実際には十分に正確ではなく、0.000001 を無視し、許容範囲として 0.0001 を好むことです (55 に近づけるように要求すると、54.994397921372205 で停止します)。私は許容範囲を 0 の後に 1 が続くクレイジーな量に増やしましたが、たとえば 50 に近づくと、49.14 と推定されます!! ひどい!なぜこれが起こるのですか?

更新:それはある必要がありますfloat()

いくつかのベクトルに基づく関数に属するシータを見つけようとしています。このコードを R で実行して、これを文字通り R から Python に変換しようとしました。

grensscore が 50 に等しいときの Theta の値を概算したいと考えています。最初の値は theta = 0.5 で、R で繰り返します。R で約 11 回の繰り返しだけで目的に到達します。

悲しいことに、これは Python では機能せず、私はこれだけ分離しました。何らかの理由で、値は 0.5 を下回ることしかできず、0.5 を超えることはできません。これらの場所でプリントを使用すると#a、コード内のパーツが実行されていないにもかかわらず、パーツが実行されていることが#bわかります。これは、値が決して上がらないことを示しているため、0.4 のような値を見つけることはできません (0.5、0.25、0.37.5、0.4375 などになる必要がありますが、0.5、0.25、0.125 しか下がらないため)。そして遅かれ早かれ停止します)

#b が実行されていることがわかります。下げなければならないときに何度も別れますが、上がることはありません。私もそれらを切り替えて、順序効果があるかどうかを確認しましたが、そうではありません:それは単にそれが真であると評価されないだけです(私がそれを知っている場合でも) Rで働いていますか?

def CalcTheta(grensscore, alpha, beta):
    theta = 0.5
    estimate = [10000]   # I just set this to not error on the check
    up = 1
    down = 0

    while((math.fabs(sum(estimate)) - grensscore) > 0.00001):

        if estimate == [10000]:     # I set it like this, 
            estimate = [grensscore] # so it will skip the first run

        # a.
        if (sum(estimate) - grensscore) < 0:
            down = theta
            print(down)
            theta = (theta + up) / 2
            print(theta)

        #b.
        if (sum(estimate) - grensscore) > 0:
            print(up, down, theta)
            up = theta
            theta = (theta + down) / 2
            print(up, down, theta)

        for x in range(len(beta)):
            if x == 0:
                estimate = []

            estimate.append(math.exp(alpha[x] * (theta - beta[x]))  / (1 + math.exp(alpha[x] * (theta - beta[x]))))

    return(theta)

CalcTheta(50, data[:,1], data[:,2])
4

2 に答える 2

1

問題は、

while(math.fabs(sum(estimate)) - grensscore) > 0.00001):

する必要があります

while(math.fabs(sum(estimate) - grensscore)) > 0.00001):

他の部分では、 ではないfloatので、あまり正確にはなりませんでした。

于 2013-03-18T19:44:06.860 に答える
0

あなたのためにそれを行うことができるいくつかのライブラリがあります。Scipy ( )をお勧めしscipy.optimize.newtonます。レシピは次の場所にあります。

http://code.activestate.com/recipes/576762-newton-raphson-root-finding/

于 2013-03-18T19:00:36.813 に答える