首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >感知器单层

感知器单层
EN

Stack Overflow用户
提问于 2013-04-12 13:39:21
回答 2查看 873关注 0票数 0

我正在努力实现一个单层感知器:http://en.wikipedia.org/wiki/Perceptron。根据权重的不同,我的程序要么在学习循环中丢失,要么找到错误的权重。作为测试用例,我使用逻辑AND。你能告诉我为什么我的感知器不收敛吗?这是为了我自己的学习。谢谢。

代码语言:javascript
复制
# learning rate
rate = 0.1

# Test data
# logical AND
# vector = (bias, coordinate1, coordinate2, targetedresult)

testdata = [[1, 0, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1]]

# initial weigths
import random
w = [random.random(), random.random(), random.random()]
print 'initial weigths = ', w

def test(w, vector):
    if diff(w, vector) <= 0.1:
        return True
    else:
        return False

def diff(w, vector):
    from copy import deepcopy
    we = deepcopy(w)
    return dirac(sum(we[i]*vector[i] for i in range(3))) - vector[3]

def improve(w, vector):
    for i in range(3):
        w[i] += rate*diff(w, vector)*vector[i]
    return w

def dirac(z):
    if z > 0:
        return 1
    else:
        return 0

error = True

while error == True:
    discrepancy = 0
    for x in testdata:
        if not test(w, x):
            w = improve(w, x)
            discrepancy += 1
    if discrepancy == 0:
        print 'improved weigths = ', w
        error = False
EN

回答 2

Stack Overflow用户

发布于 2013-04-12 16:36:39

看起来您需要在for循环周围添加一个额外的循环来迭代改进,直到您的解决方案收敛为止(您所链接的Wikipedia页面中的步骤3)。

按照现在的情况,您只给每个训练用例一次更新权重的机会,因此它没有机会收敛。

票数 1
EN

Stack Overflow用户

发布于 2013-04-12 19:06:23

  1. 我能看到的唯一的小故障就是激活功能。增加截止值,(z > 0.5).
  2. Also,因为每个时期只有4个输入案例,所以很难使用0和1作为唯一的输出。尝试删除dirac函数并将阈值增加到0.2。它可能需要更长的时间来学习,但会更精确。当然,在NAND的情况下,您实际上不需要这样做。但它在understanding.

中很有帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15963858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档