本文主要讲Python实现感知机算法,简单讲一下感知机模型,学习策略和算法。
import copy training_set = [[(3, 3), 1], [(4, 3), 1], [(1, 1), -1]] #以书本训练数据为例 w = [0, 0] #权值向量 b = 0 #偏置 history = [] #存放所有的w和b的历史记录 #更新w和b def update(item): global b #这里的变量需要定义为全局变量,否则会认为b是局部变量 w[0]=w[0]+1*item[1]*item[0][0] w[1]=w[1]+1*item[1]*item[0][1] b=b+1*item[1] history.append([copy.copy(w),b]) #浅拷贝w,因为w的值一直在更新 #计算误分类点 def cal(item): res=0 for i in range(len(item[0])): res=res+(w[i]*item[0][i]) res=res+b res=res*item[1] return res #检查是否没有误分类点 def check(): flag=False for i in range(len(training_set)): if(cal(training_set[i])<=0): flag=True update(training_set[i]) if not flag: print("最终的w为"+str(w)) #将结果转换成字符串 print("最终的b为"+str(b)) return flag if __name__ == "__main__": for i in range(1000): if not check():break #check()返回的是False才结束,所以不能定义为真结束, #有误判断点 也是为真 print("w和b的迭代记录"+str(history))
算法比较简单,三个函数,知道最后没有误分类点即可,采用迭代的思想,结果也和书本上一致。
最终的w为[1, 1] 最终的b为-3 w和b的迭代记录[[[3, 3], 1], [[2, 2], 0], [[1, 1], -1], [[0, 0], -2], [[3, 3], -1], [[2, 2], -2], [[1, 1], -3]]