我正在遵循编码训练的教程,其中我们必须制作一个简单的感知器来识别一个点是高于还是低于线。
我的感知器类的构造函数使用numpy.random.uniform
函数创建 2 个随机权重, 然后我们有猜测函数,它接收一个列表inputs
与点的(x,y)
坐标。
公式为
(W1 * 输入 1( + (W2 * 输入 2(
然后我的符号函数使输出仅为 1 或 -1
如果该公式的结果为>= 0
则输出将为 1,否则为 -1
import numpy
# activation function
def sign(n):
if n < 0:
return -1
else:
return 1
class Perceptron:
def __init__(self):
self.weights = [0.0, 0.0]
# initialize the weights randomly
for i in self.weights:
# generate a random weight
# from -1 to 1
i = numpy.random.uniform(-1, 1)
print('weights: ', i)
def guess(self, inputs):
sum = 0.0
for i in range(len(self.weights)):
print('inputs: ', inputs[i])
print('formula: ', inputs[i] * self.weights[i])
sum += inputs[i] * self.weights[i]
print('sum', sum)
output = sign(sum)
print('Output: ', output)
return output
输入经过硬编码以测试inputs = [-1, -0.5]
在下面的输出中,公式应为:
总和 = (0.6628487604118101 * -1( + (0.44508063558107414* -0.5(
总和 = -0.66284876041 + -0.22254031779
总和 = -0.8853890782
因此,由于它小于 0,因此输出必须-1
这是我尝试运行它时的输出,我使用了一些打印来解码程序,但我不知道为什么我总是得到 1。
$ python main.py
weights: 0.6628487604118101
weights: 0.44508063558107414
inputs: -1
formula: -0.0
sum 0.0
inputs: -0.5
formula: -0.0
sum 0.0
Output: 1
正如注释已经指出的那样,您的权重分配代码实际上并没有分配权重。当循环离开时,它们会丢失。
这个(可能不是很有效(代码段可能会完成您想要实现的目标:
numWeights = 2
weights = []
for i in range(numWeights):
w = numpy.random.uniform(-1, 1)
weights.append(w)
print('weight:', w)