0

線 (パーセプトロン) f を作成し、一方の点を +1 に、もう一方の点を -1 にすることで、データ ポイントのトレーニング セットを作成しようとしています。次に、新しい行 g を作成し、w = w+ y(t)x(t) で更新することにより、できるだけ f に近づけようとします。ここで、w は重み、y(t) は +1,-1 および x(t) です。 ) は誤分類されたポイントの座標です。これを実装した後、gからfへの適合があまり良くありません。ここに私のコードといくつかのサンプル出力があります。

import random

random.seed()

points = [ [1, random.randint(-25, 25), random.randint(-25,25), 0] for k in range(1000)]

weights = [.1,.1,.1]

misclassified = []

############################################################# Function f

interceptf = (0,random.randint(-5,5))

slopef = (random.randint(-10, 10),random.randint(-10,10))

point1f = ((interceptf[0] + slopef[0]),(interceptf[1] + slopef[1]))
point2f = ((interceptf[0] - slopef[0]),(interceptf[1] - slopef[1]))

############################################################# Function G starting
interceptg = (-weights[0],weights[2])

slopeg = (-weights[1],weights[2])

point1g = ((interceptg[0] + slopeg[0]),(interceptg[1] + slopeg[1]))
point2g = ((interceptg[0] - slopeg[0]),(interceptg[1] - slopeg[1]))
#############################################################

def isLeft(a, b, c):
      return ((b[0] - a[0])*(c[1] - a[1]) - (b[1] - a[1])*(c[0] - a[0])) > 0


for i in points:
    if isLeft(point1f,point2f,i):
        i[3]=1
    else:
        i[3]=-1

for i in points:
    if (isLeft(point1g,point2g,i)) and (i[3] == -1):
        misclassified.append(i)

    if (not isLeft(point1g,point2g,i)) and (i[3] == 1):
        misclassified.append(i)

print len(misclassified)


while misclassified:
    first = misclassified[0]
    misclassified.pop(0)

    a = [first[0],first[1],first[2]]
    b = first[3]

    a[:] = [x*b for x in a]

    weights = [(x + y) for x, y in zip(weights,a)]

interceptg = (-weights[0],weights[2])

slopeg = (-weights[1],weights[2])

point1g = ((interceptg[0] + slopeg[0]),(interceptg[1] + slopeg[1]))
point2g = ((interceptg[0] - slopeg[0]),(interceptg[1] - slopeg[1]))

check = 0

for i in points:
    if (isLeft(point1g,point2g,i)) and (i[3] == -1):
        check += 1

    if (not isLeft(point1g,point2g,i)) and (i[3] == 1):
        check += 1

print weights
print check

117 <--- g で誤分類された元の数

[-116.9, -300.9, 190.1] <--- 最終的な重み

617 <--- アルゴリズム後の g による元の誤分類の数

956 <--- g で誤分類された元の数

[-33.9, -12769.9, -572.9] <--- 最終的な重み

461 <--- アルゴリズム後の g による元の誤分類の数

4

1 に答える 1

0

アルゴリズムには少なくともいくつかの問題があります。

  • 「while」条件が間違っています。パーセプトロン学習は、現在行っているように、誤分類されたすべてのポイントを1 回反復することではありません。アルゴリズムは、それらのいずれかが誤分類されている限り、すべてのポイントを反復処理する必要があります。特に、更新ごとに、正しく分類されたポイントが間違ったポイントになる可能性があるため、常にそれらすべてを繰り返し処理し、すべてが正常かどうかを確認する必要があります。

  • あなたが実際に望んでいたのは、予測されたラベルであり、真のラベル(y(i)-p(i))x(i)であるという形でルールを更新することであると確信しています(ただし、誤分類のみを更新する場合、これは明らかにメソッドに劣化します)p(i)y(i)

于 2013-09-04T06:11:08.360 に答える