2

パーセプトロンは、NAND、AND、OR 関数の出力のように、線形に分離可能なセットでのみ正しく機能することを理解しています。パーセプトロンに関するウィキペディアのエントリを読んでいて、そのコードをいじってみました。

XOR は、線形分離可能なセットではないため、単層パーセプトロンが失敗するケースです。

#xor
print ("xor")
t_s           = [((1, 1, 1), 0), ((1, 0, 1), 1), ((1, 1, 0), 1), ((1, 1, 1), 0)] 


threshold     = 0.5
learning_rate = 0.1
w             = [0, 0, 0]

def dot_product(values, weights):
    return sum(value * weight for value, weight in zip(values, weights))

def train_perceptron(threshold, learning_rate, weights, training_set):
    while True:
        #print('-' * 60)
        error_count = 0

        for input_vector, desired_output in training_set:
            #print(weights)
            result = dot_product(input_vector, weights) > threshold
            error  = desired_output - result

            if error != 0:
                error_count += 1
                for index, value in enumerate(input_vector):
                    weights[index] += learning_rate * error * value

        if error_count == 0: #iterate till there's no error 
            break
    return training_set

t_s = train_perceptron(threshold, learning_rate, w, t_s)

t_s = [(a[1:], b) for a, b in t_s]

for a, b in t_s:
    print "input: " + str(a) + ", output: " + str(b)

この Ideone 実行の出力は、 XOR に対して正しいものです。どうして?

xor
input: (1, 1), output: 0
input: (0, 1), output: 1
input: (1, 0), output: 1
input: (1, 1), output: 0
4

3 に答える 3

6

に入力t_strain_perceptron、変更せずに返します。次に、それを出力します。もちろん、それは完全に機能します....

t_s = train_perceptron(threshold, learning_rate, w, t_s)

これはまったく変わりませんt_strain_perceptron一切変更しませんtraining_set。しかし、それを返します:return training_set

次に、ここで出力します:

t_s = [(a[1:], b) for a, b in t_s]

for a, b in t_s:
    print "input: " + str(a) + ", output: " + str(b)
于 2014-01-15T17:08:00.790 に答える
1

トレーニング セットを変更してみてください。

t_s = [((1, 1, 1), 0), ((1, 0, 1), 1), ((1, 1, 0), 1), ((0, 0, 0), 0)]
于 2014-01-15T17:18:01.730 に答える