感知器

#coding=utf-8
import copy

def pre(data):
    """预处理,样本增广化"""
    lenth=len(data)
    for i in range(lenth):
        data[i].append(1)
    for j in range(lenth/2):
        for k in range(len(data[0])):
            data[lenth-j-1][k] = data[lenth-j-1][k]*(-1)
    return


def fit(data,k,p,w,temp):
    """不要使用'='来用list给list赋值,'='是将地址进行赋值,从而改变一个list另一个也会发生变化,所以使用copy.copy进行赋值"""
    lenth = k%len(data)-1
    x = data[lenth]
    print lenth
    print w
    temp[lenth] = copy.copy(w)
    print temp
    sum = 0
    print u""+str(k)+u"次迭代 增广权矢量:"+str(w)
    for i in range(len(w)):
        sum = sum + w[i]*x[i]
    k = k+p
    if temp[0]==temp[1] and temp[1]==temp[2] and temp[2]==temp[3]:    #当连续4次不变时结束训练,认为所有模式都能够正确分类为止
        exit()
    if sum > 0:
        fit(data,k,p,w,temp)
    elif sum <= 0:
        for i in range(len(w)):
            w[i] = w[i] + x[i]
        fit(data,k,p,w,temp)


data = [[0,0],[0,1],[1,0],[1,1]]      #样本
w = [1,1,1]                            #增广权矢量
temp=[[],[],[],[]]                     #判断list,用来判断迭代结束
p = 1                                  #增量
k = 1                                  #迭代步数
pre(data)                              #预处理
fit(data,k,p,w,temp)                   #迭代训练

做这个的时候出现了一个bug,开始list赋值直接使用的'=',发现改变一个元素时所以元素都发生了改变。

这里的'='其实是把地址进行了赋值,例如让list1=list2,那么改变list时list1也会发生变化,要使用copy.copy才是对象赋值

原文地址:https://www.cnblogs.com/Aiden-/p/10126053.html