【Perception】判别函数·感知器算法

原创 2017年01月03日 18:50:40

0x00 前言

这是中科院(国科大)黄庆明老师的《模式识别与机器学习》课程 (2016Autumn) 中的内容,复习期间为了加深记忆尝试着敲了敲,对于MachineLearning而言,这在判别函数中是一种入门级的算法,作为入门ML的新手,我决定敲一下,于我而言感觉可以更有助于理解~

0x01 感知器算法

  • 感知器算法实质上是一种赏罚过程
  • 对正确分类的模式则“赏”,实际上是“不罚”,即权向量不变。
  • 对错误分类的模式则“罚”,使w(k)加上一个正比于xk的分量。
  • 当用全部模式样本训练过一轮以后,只要有一个模式是判别错误的,则需要进行下一轮迭代,即用全部模式样本再训练一次。
  • 如此不断反复直到全部模式样本进行训练都能得到正确的分类结果为止。

算法照片

0x02 Source Code

#coding=utf8
# ========================================================
#   Copyright (C) 2016 All rights reserved.
#   
#   filename : hwk2.py
#   author   : okcd00
#   date     : 2017-01-02
#   desc     : Single Perceptron Algorithm
#   homepage : blog.csdn.net/okcd00
# ======================================================== 

import os,sys,time
import numpy as np
import pylab as pl
import matplotlib.pyplot as plt

reload(sys)
sys.setdefaultencoding('utf8')

def readFile(filename):
    with open(filename,'r') as f:
        matP, matN = [], []
        Flag = True
        for line in f.readlines():
            line = line.strip()
            if not line or line.startswith('#'): 
                Flag = False
                continue
            # Augmented vector
            if Flag: matP.append([int(item) for item in line.split(' ')] + [1])
            else   : matN.append([int(item) for item in line.split(' ')] + [1]) 
    return matP, matN

def showResult(l):
    ret = "d(x) = "
    for idx in range(l.__len__()-1):
        if l[idx] != 0.0: ret += "%.2f*x%d + " % (l[idx], idx+1)
    return "%s%.2f" % (ret, l[-1])

def Iterative_Solve(mat, w, row, midProcess = False):
    iter_idx, idx = 0, 0
    while True:
        Flag = True
        iter_idx += 1
        if midProcess: print "\nIteration <%d>:" % iter_idx
        for r in range(row):
            idx += 1
            judge = not np.dot(w, mat[r,:].T) > 0
            if judge: 
                Flag = False
                w = w + mat[r,:]
                if midProcess: 
                    print "w(%d) = w(%d) + x(%d)" % (idx, idx-1, r+1)            
                    print "w(%d) = " % idx, w
            elif midProcess: print "w(%d) = w(%d)" % (idx, idx-1)
        if Flag: break
    return showResult(list(w)[0])

if __name__ == '__main__':
    matP, matN = readFile('hwk2Data.txt')
    mat = np.concatenate((np.array(matP), -np.array(matN)), axis=0)

    size = mat.shape
    matw = np.zeros((1, size[1]))
    print "Matrix_X = \n", mat
    ans = Iterative_Solve(mat, matw, size[0], True)

    print "\nCorresponding discriminant function is:\n", ans

0x03 CodeTest

  • 实际问题 (实例 · 维度3)
    用感知器算法求下列模式分类的解向量w:
    ω1: {(0 0 0)T, (1 0 0)T, (1 0 1)T, (1 1 0)T}
    ω2: {(0 0 1)T, (0 1 1)T, (0 1 0)T, (1 1 1)T}

  • hwk2Data.txt

0 0 0
1 0 0
1 0 1
1 1 0
#####
0 0 1
0 1 1
0 1 0
1 1 1
  • Result
>python hwk2.py
Matrix_X =
[[ 0  0  0  1]
 [ 1  0  0  1]
 [ 1  0  1  1]
 [ 1  1  0  1]
 [ 0  0 -1 -1]
 [ 0 -1 -1 -1]
 [ 0 -1  0 -1]
 [-1 -1 -1 -1]]

Iteration <1>:
w(1) = w(0) + x(1)
w(1) =  [[ 0.  0.  0.  1.]]
w(2) = w(1)
w(3) = w(2)
w(4) = w(3)
w(5) = w(4) + x(5)
w(5) =  [[ 0.  0. -1.  0.]]
w(6) = w(5)
w(7) = w(6) + x(7)
w(7) =  [[ 0. -1. -1. -1.]]
w(8) = w(7)

Iteration <2>:
w(9) = w(8) + x(1)
w(9) =  [[ 0. -1. -1.  0.]]
w(10) = w(9) + x(2)
w(10) =  [[ 1. -1. -1.  1.]]
w(11) = w(10)
w(12) = w(11)
w(13) = w(12) + x(5)
w(13) =  [[ 1. -1. -2.  0.]]
w(14) = w(13)
w(15) = w(14)
w(16) = w(15)

Iteration <3>:
w(17) = w(16) + x(1)
w(17) =  [[ 1. -1. -2.  1.]]
w(18) = w(17)
w(19) = w(18) + x(3)
w(19) =  [[ 2. -1. -1.  2.]]
w(20) = w(19)
w(21) = w(20) + x(5)
w(21) =  [[ 2. -1. -2.  1.]]
w(22) = w(21)
w(23) = w(22) + x(7)
w(23) =  [[ 2. -2. -2.  0.]]
w(24) = w(23)

Iteration <4>:
w(25) = w(24) + x(1)
w(25) =  [[ 2. -2. -2.  1.]]
w(26) = w(25)
w(27) = w(26)
w(28) = w(27)
w(29) = w(28)
w(30) = w(29)
w(31) = w(30)
w(32) = w(31)

Iteration <5>:
w(33) = w(32)
w(34) = w(33)
w(35) = w(34)
w(36) = w(35)
w(37) = w(36)
w(38) = w(37)
w(39) = w(38)
w(40) = w(39)

Corresponding discriminant function is:
d(x) = 2.00*x1 + -2.00*x2 + -2.00*x3 + 1.00

0xFF 关于感知器(Perception Approach)

  • 基本思想
    采用感知器算法能通过对训练模式样本集的“学习”得到判别函数的系数。
  • 说明
    这里采用的算法不需要对各类别中模式的统计性质做任何假设,因此称为确定性的方法。
  • 出发点
    一旦判别函数的形式确定下来,不管它是线性的还是非线性的,剩下的问题就是如何确定它的系数。
    在模式识别中,系数确定的一个主要方法就是通过对已知样本的训练和学习来得到。
    感知器算法就是通过训练样本模式的迭代和学习,产生线性(或广义线性)可分的模式判别函数。
  • 收敛性
    只要模式类别是线性可分的,就可以在有限的迭代步数里求出权向量。
  • 背景
    “感知器”一词出自于20世纪50年代中期到60年代中期人们对一种分类学习机模型的称呼,它是属于有关动物和机器学习的仿生学领域中的问题。
    当时的一些研究者认为感知器是一种学习机的强有力模型,后来发现估计过高了,但发展感知器的一些相关概念仍然沿用下来。
  • 更多信息也可参阅 Wikipedia传送门
版权声明: 本文为博主原创,转载请注明出处 blog.csdn.net/okcd00

相关文章推荐

perception感知器算法的C语言实现代码

此处仅给出代码实现,具体原理及过程请看前面的博文 文件输入格式如下: 2 4 0.25 5 0 0 0 0 1 1 1 0 1 1 1 1 0.06230 0.01123 -0.07335 含义如下:...

模式识别(Pattern Recognition)学习笔记(九)--感知器

感知器是一种可以直接得到线性判别函数 的线性分类方法,由于它是基于样本线性可分这样的一个要求下使用的,所以,首先来了解下什么是线性可分与线性不可分。 1.线性可分与线性不可分 首先,为了打好基础,...

线性分类器之感知器模型(Perceptron)

前文提到,Fisher判别器的设计一般分两步,一是确定最优的投影方向,二是在投影方向上确定阈权值。而感知器则是一种直接得到完整的线性判别函数g(x)=ωTx+ω0g(x)=\omega_Tx+\ome...

模式识别:感知器的实现

在之前的模式识别研究中,判别函数J(.)的参数是已知的,即假设概率密度函数的参数形式已知。本节不考虑概率密度函数的确切形式,使用非参数化的方法来求解判别函数。由于线性判别函数具有许多优良的特性,因此这...

MachineLearning:二、感知器perception算法

感知机对DL有着重要的启发意义
  • Earl211
  • Earl211
  • 2015年10月08日 16:58
  • 1963

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

模式识别:感知器的实现

模式识别:感知器的实现 http://blog.csdn.net/liyuefeilong/article/details/45217335 在之前的模式识别研...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

感知器算法及实现(个人觉得很不错!)

从博客园转载过来格式有问题,显示不完全,原文链接http://www.cnblogs.com/OldPanda/archive/2013/04/12/3017100.html 笔记—...
  • gningh
  • gningh
  • 2013年06月24日 10:08
  • 10423

模式识别(Pattern Recognition)学习笔记(二十二)--广义线性判别函数

前面讨论过在样本线性可分与不可分下的SVM,知道了不管是样本可分还是不可分,不管是狭义的还是广义的,它都是属于线性,那么我们应该如何构造非线性的SVM呢?本篇文章先不讲有关如何构造的问题,先来讨论下传...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Perception】判别函数·感知器算法
举报原因:
原因补充:

(最多只允许输入30个字)