1、感知机主要针对的问题是二类分类问题,解决的情况是线性可分的情况。感知机学习算法是高维SVM分类问题的基础。
2、感知机模型如下:f(x)= sign(w*x+b) 其中,x为输入向量,sign为符号函数,括号里面大于等于0,则其值为1,括号里面小于0,则其值为-1。w为权值向量,b为偏置。求感知机模型即求模型参数w和b。感知机预测,即通过学习得到的感知机模型,对于新的输入实例给出其对应的输出类别1或者-1。
3、感知机学习的学习策略是最小化损失函数:
损失函数对应于误分类点到分离超平面的总距离。
4、感知机学习算法是基于随机梯度下降法对损失函数的最优化算法,有原始形式和对偶形式。算法简单且易于实现。原始形式中,首先任意选取一个超平面,然后用梯度下降法不断极小化目标函数。在这个过程中一次随机选取一个误分类点使其梯度下降。
python代码:
import os import sys b=0 x=[] y=[] w=[] num=int(sys.argv[1]) def vecmulvec(a,b): sum=0 if len(a)!=len(b): sys.stderr("vector multiply err ") for i in range(len(a)): sum+=(a[i]*b[i]) return sum def nummulvec(n,v): t = v[:] for i in range(len(v)): t[i] = n*v[i] return t def addvec(w,v): for i in range(len(w)): w[i] = w[i]+v[i] return w def calc(): global w,x,y,b flag = True for i in range(len(y)): while y[i]*(vecmulvec(x[i],w)+b) <= 0: flag = False w = addvec(w,nummulvec(y[i],x[i])) b = b + y[i] return flag for line in sys.stdin: if not line : break line = line.strip().split() if len(line)!= num+1: sys.stderr("line format error" + " ".join(line)) break x.append([int(line[i]) for i in range(len(line)-1)]) y.append(int(line[-1])) for i in range(num): w.append(0) while True: if calc(): break for i in range(num): print str(w[i])+"*x("+str(i)+")+", print b, print '=0'
关于感知机就写这么多了,对偶形式不多说,测试集合的线性组合而已。另外,迭代次数那个证明没怎么看明白,希望明白的人讲讲。