2

http://en.wikipedia.org/wiki/Perceptron#Example

私の質問は、NAND が 2 つのパラメーターのみを取り、1 を返すときに、各ベクトルに 3 つの入力値があるのはなぜですか?

http://en.wikipedia.org/wiki/Sheffer_stroke#定義

あなたの便宜のために貼り付けられたコード:

th = 0.1
learning_rate = 0.1
weights = [0, 0, 0]
training_set = [((1, 0, 0), 1), ((1, 0, 1), 1), ((1, 1, 0), 1), ((1, 1, 1), 0)]

def sum_function(values):
    return sum(value * weights[index] for index, value in enumerate(values))

while True:
    print '-' * 60
    error_count = 0
    for input_vector, desired_output in training_set:
        print weights
        result = 1 if sum_function(input_vector) > th else 0
        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:
        break
4

4 に答える 4

2

これは、定数入力である 1 つの値が必要だからです。- バイアスとも呼ばれます。

同様に 3 つの重みがあることに気付いた場合、トリプルの最初の項目 (常に 1 のように見える) は「入力 0」(バイアス) と見なされます。これは定数です。

YouTube でこれらのビデオをご覧になることをお勧めします:ニューラル ネットワークの簡単な説明

お役に立てれば

于 2012-05-06T10:09:52.383 に答える
0

私の答えは Java です。私は Python を始めたばかりなので、慣れたらこの答えを更新します。

boolean nand(boolean[] a) {
  boolean b = true
  if (a.length > 1) {
    b = a[0] && a[1];
    if (a.length > 2)
      for (int i = 2; i < a.length; i++)
        b &= a[i];
  }
  return !b;
}

使用法 (true を返す必要があります):

nand(training_set[i][0]) == training_set[i][1]

編集

2年以上後、私はこの質問に戻って答えを追加しました...

Pythonで反復的かつ再帰的なソリューションを作成しました。また、golf を再帰的にコーディングすることも試みました。106バイトまで減らしました。

実装

反復

def nand(*a):
    if len(a) > 1:
        b = a[0] and a[1]
        if len(a) > 2:
            for i in range(2, len(a)):
                b = b and a[i]
        return not b
    return None

再帰的

def nand(*a):
    if len(a) < 2:
        return None
    elif len(a) == 2:
        return not (a[0] and a[1])
    else:
        return nand(*([a[0] and a[1]] + list(a[2:])))

再帰 (ラムダ)

nand=lambda*a:None if len(a)<2 else not(a[0]and a[1])if len(a)==2 else nand(*([a[0]and a[1]]+list(a[2:])))

結果

print nand(True,  True,  True)   #  ¬(1 ∧ 1 ∧ 1) == 0
print nand(True,  True,  False)  #  ¬(1 ∧ 1 ∧ 0) == 1
print nand(True,  False, True)   #  ¬(1 ∧ 0 ∧ 1) == 1
print nand(True,  False, False)  #  ¬(1 ∧ 0 ∧ 0) == 1
print nand(False, True,  True)   #  ¬(0 ∧ 1 ∧ 1) == 1
print nand(False, True,  False)  #  ¬(0 ∧ 1 ∧ 0) == 1
print nand(False, False, True)   #  ¬(0 ∧ 0 ∧ 1) == 1
print nand(False, False, False)  #  ¬(0 ∧ 0 ∧ 0) == 1
于 2012-10-31T13:30:51.593 に答える
-1

NAND は、必要な数の引数を取ることができます。すべての入力値を単純に AND し、出力を否定します。

// 2 arguments
!(A & B)

// 3 arguments
!(A & B & C)

// n argument
!(A & B & ... & n)
于 2012-03-11T23:53:17.703 に答える