#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才是对象赋值