zoukankan      html  css  js  c++  java
  • 统计学习方法 二 感知机

    感知机

    (一)概念

            

    1,定义:

            

    (二),学习策略

    1,线性可分 :存在一个超平面将正实例和负实例划分开来,反之不可分

    2,学习策略:寻找极小损失函数,通过计算误分点到超平面的距离

               

    3,学习算法 即求解损失函数最优化的算法,借用随机梯度下降法

    3.1 原始形式  学习率也叫步长(0,1]

                

    例题:

                

            

              

    python代码:

    #init w,b,
    w=[0,0]
    b=0
    #init datasets
    def createDatas():
        return[([3,3],1),([1,1],-1),([4,3],1)]
    #updata w and b
    def update(item):
        global w,b
        #w+=item[1]*item[0]
        w[0] += item[1] * item[0][0]
        w[1] += item[1] * item[0][1]
        b+=item[1]
        return w,b
    #calculate the functional distance between 'item' an the dicision surface. output yi(w*xi+b).
    def distance(item):
        dist=0
        for i in range(len(item[0])):
            dist+=w[i]*item[0][i]
        dist+=b
        dist*=item[1]
        return dist
    # check if the hyperplane can classify the examples correctly
    def check():
        flag=False
        # 计算形式不同:是每次更新w,b,接着就用更新的w,b去跟下个项计算判断
        #还是一直用更新的w,b与原先的项计算判断,哪个快些?,算法思路应该前者,(用if还是while来判断,哪个更快收敛?)
        for item in dataSets:
            if(distance(item=item)<=0):
                flag = True
                update(item=item)
        if not flag:
            print"Result w:",str(w),"b:",str(b)
        return flag
    if __name__=="__main__":
        dataSets=createDatas()
        while check():
            pass
    #result Result w: [3, 1] b: -5

    特点:如果初值不同或步长或选取的误分类点顺序改变,都可能使最后求出的w和b结果不同,针对线性可分的数据

    3.2 迭代次数的收敛性:当训练数据集线性可分时,感知机学习算法原始形式迭代是可以收敛

    3.3 感知学习机算法对偶形式

              Gram计算:x1*x1,x1*x2,x1*x3 类似

              误分条件:(a1*y1...an*yn)*Gram中每一行 

                

              

              

               

    python代码:

    import numpy as np
    def createDataSets():
        return np.array([[[3,3],1],[[3,4],1],[[1,1],-1]])
    #关键理解np.array trainsets[:,1]第二列,trainsets[i][0]指向[3,3],[3,4]这一列,dot内积
    def cal_gram():
        g=np.empty((len(trainsets),len(trainsets)),np.int)
        for i in range(len(trainsets)):
            for j in range(len(trainsets)):
                g[i][j]=np.dot(trainsets[i][0],trainsets[j][0])
        return g
    def cal(i):
        res=np.dot(alpha*y,Gram[i])
        res=(res+b)*y[i]
        return res
    def update(i):
        global alpha,b
        alpha[i]+=1
        b+=y[i]
    def check():
        flag=False
        for i in range(len(trainsets)):
            if cal(i)<=0:
                flag=True
                update(i)
        if not flag:
            w=np.dot(alpha*y,x)
            print "Result: w",str(w),"b",b
        return flag
    if __name__=="__main__":
        trainsets=createDataSets()
        alpha=np.zeros(len(trainsets),np.float)
        b=0.0
        y=np.array(trainsets[:,1])
        x=np.empty((len(trainsets),2),np.float)
        for i in range(len(trainsets)):
            x[i]=trainsets[i][0]
            Gram=cal_gram()
        while check():
            pass

    (四),总结

              

       优化方法:但是用普通的基于所有样本的梯度和的均值的批量梯度下降法(BGD)是行不通的,原因在于我们的损失函数里面有限定,只有误分类的M集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。

       对偶使用更多:

        缺陷:泛化能力不强,维度越高,准确率越低,只局限与线性可分的数据集,来寻找最优直线或超平面,但这是支持向量机和神经网络的重要基础,比如支持向量机可以通过核技巧来让数据在高维可分,神经网络可以通过激活函数和增加隐藏层来让数据可分。

        参考目录:

        http://www.cnblogs.com/MrLJC/p/4428443.html

        http://www.cnblogs.com/MrLJC/p/4428443.html

  • 相关阅读:
    常用正则表达式
    python 正则表达式 匹配指定字符遇到问题记录
    python 正则表达式 匹配指定字符
    python 正则表达式
    vim多窗口, 常用命令集
    linux寻找文件
    配置VIM环境
    本地计算机上的XXX服务启动后停止,某些服务在未由其它服务或程序使用时将自动停止
    Centos7安装python3、numpy、scipy、matplotlib、pandas等
    vmware虚拟机安装CentOS7无法上网以及键盘无法输入情况解决
  • 原文地址:https://www.cnblogs.com/ksWorld/p/7100829.html
Copyright © 2011-2022 走看看