感知机分类算法学习

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'


关于感知机就写这么多了,对偶形式不多说,测试集合的线性组合而已。另外,迭代次数那个证明没怎么看明白,希望明白的人讲讲。

posted on 2013-12-30 17:12  _Clarence  阅读(987)  评论(0编辑  收藏  举报

导航