感知机

                   

                      

                      

                       

                         

                                  

                        

from numpy import *  
import operator
import os



# create a dataset which contains 3 samples with 2 classes  
def createDataSet():  
    # create a matrix: each row as a sample  
    group = array([[3,3], [4,3], [1,1]])  
    labels = [1, 1, -1] # four samples and two classes  
    return group, labels

#classify using perceptron
def perceptronClassify(trainGroup,trainLabels):
    global w, b
    isFind = False  #the flag of find the best w and b
    numSamples = trainGroup.shape[0]
    mLenth = trainGroup.shape[1]
    w = [0]*mLenth
    b = 0
    while(not isFind):
        for i in xrange(numSamples):
            if cal(trainGroup[i],trainLabels[i]) <= 0:
                print w,b
                update(trainGroup[i],trainLabels[i])
                break    #end for loop
            elif i == numSamples-1:
                print w,b
                isFind = True   #end while loop


def cal(row,trainLabel):
    global w, b
    res = 0
    for i in xrange(len(row)):
        res += row[i] * w[i]
    res += b
    res *= trainLabel
    return res
def update(row,trainLabel):
    global w, b
    for i in xrange(len(row)):
        w[i] += trainLabel * row[i]
    b += trainLabel

createDataSet()
perceptronClassify(g,l)

 

                        

                       

                      

from numpy import *  
import operator
import os



# create a dataset which contains 3 samples with 2 classes  
def createDataSet():  
    # create a matrix: each row as a sample  
    group = array([[3,3], [4,3], [1,1]])  
    labels = [1, 1, -1] # four samples and two classes  
    return group, labels

#classify using DualPerception
def dualPerceptionClassify(trainGroup,trainLabels):
    global a,b
    isFind = False
    numSamples = trainGroup.shape[0]
    #mLenth = trainGroup.shape[1]
    a = [0]*numSamples
    b = 0
    gMatrix = cal_gram(trainGroup)
    while(not isFind):
        for i in xrange(numSamples):
            if cal(gMatrix,trainLabels,i) <= 0:
                cal_wb(trainGroup,trainLabels)
                update(i,trainLabels[i])
                break
            elif i == numSamples-1:
                cal_wb(trainGroup,trainLabels)
                isFind = True
    

# caculate the Gram matrix
def cal_gram(group):
    mLenth = group.shape[0]
    gMatrix = zeros((mLenth,mLenth))
    for i in xrange(mLenth):
        for j in xrange(mLenth):
            gMatrix[i][j] =  dot(group[i],group[j])
    return gMatrix

def update(i,trainLabel):
    global a,b
    a[i] += 1
    b += trainLabel

def cal(gMatrix,trainLabels,key):
    global a,b
    res = 0
    for i in xrange(len(trainLabels)):
        res += a[i]*trainLabels[i]*gMatrix[key][i]
    res = (res + b)*trainLabels[key]
    return res

#caculator w and b,then print it
def cal_wb(group,labels):
    global a,b
    w=[0]*(group.shape[1])
    h = 0
    for i in xrange(len(labels)):
        h +=a[i]*labels[i]
        w +=a[i]*labels[i]*group[i]
    print w,h

 

createDataSet()
dualPerceptionClassify(g,l)

                      

感知机算法分析:

  (1)感知机二分类模型为  f(x) = sign(w.x+b)  分类超平面为w.x+b=0

  (2) 感知机学习策略是极小化损失函数  minL(w,b)  损失函数对应于误分类点到超平面之间的距离

  (3)感知机学习算法是基于随机梯度下降算法的对损失函数的最优化算法,有原始形式,对偶形式。

  (4)当数据是线性可分的时候,感知机学习算法是收敛的,即经过有限次迭代之后,总能找到一个超平面正确进行分类。此外,感知机学习算法存在无穷多个解,其解由于初值以及迭代顺序的不同而可能不同。

 

补充: 为什么要用对偶形式

对偶形式的目的是降低运算量,但是并不是在任何情况下都能降低运算量,而是在特征空间的维度很高时才起到作用。

不妨设特征空间是 \mathbb{R}^nn 很大,一共有 N 个训练数据, N 相对 n 很小。我们考虑原始形式的感知机学习算法,每一轮迭代中我们至少都要判断某个输入实例是不是误判点,既对于 x_i,y_i ,是否有 y_i(wx_i+b) \leq 0 。这里的运算量主要集中在求输入实例 x_i 和权值向量 w 的内积上,\Theta(n) 的时间复杂度,由于特征空间维度很高,所以这很慢。

而在对偶形式的感知机学习算法中,对于输入实例 (x_i,y_i) 是否误判的条件变换为 y_i(\sum_{j=1}^{N}\alpha_jy_jx_jx_i+b)\leq0 。注意到这里所有输入实例都仅仅以内积的形式出现,所以我们可以预先计算输入实例两两之间的内积,得到所谓的Gram矩阵 G=[x_ix_j]_{N \times N} 。这样一来每次做误判检测的时候我们直接在Gram矩阵里查表就能拿到内积 x_jx_i ,所以这个误判检测的时间复杂度是 \Theta(N)

也就是说,对偶形式的感知机,把每轮迭代的时间复杂度的数据规模从特征空间维度 n 转移到了训练集大小 N 上,那么对于维度非常高的空间,自然就能提升性能了。

 

             


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值