这里放个机器学习中的感知机的实现方法,虽然感知机相比支持向量机(SVM)还有差距,但是理解这种超平面分类方法也是不错的长进。如果想进一步了解该算法的数学思想,参考李航的《统计学习方法》。

概念阐释:
- 感知机(perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1两种值。
- 感知机为判别模型,用来将输入空间中的实例划分为正负两类的分离超平面。
- 假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练集正例点和负例点完全正确分开的分离超平面。
感知机算法:
感知机学习算法是误分类驱动的,具体采用随机梯度下降法。其目的就是极小化损失函数(其实几乎所有分类模型都是为了减小损失函数,提高分类准确度)。需要注意的是:极小化的过程不是一次使所有误分类点梯度下降,而是一次随机选取一个误分类点,使其梯度下降。
算法实现:(Python)
#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
#*************************************************************************
# > File Name: Perceptron.py
# > Author: HarryPotter
# > Created Time: 2019年08月30日 星期五 13时59分51秒
#*************************************************************************
import pdb
import sys
import numpy as np
class Perceptron(object):
def __init__(self, data, label):
self.w = np.array([0, 0])
self.b = 0
self.data = data
self.label = label
def __call(self, s, l):
''' s -> sample eg. [3,3]; l -> label eg. +1
'''
return (sum(s * self.w) + self.b) * l
def __update(self, s, l):
''' w -> w + l * s; b -> b + l
'''
self.w += l * s
self.b += l
def training(self):
finish = False
sam_num = len(self.data)
while (not finish):
for i in xrange(sam_num):
if self.__call(self.data[i], self.label[i]) <= 0:
print self.w, self.b
self.__update(self.data[i], self.label[i])
break
if i == sam_num-1:
print self.w, self.b
finish = True
return
if __name__ == '__main__':
data = np.array([ [3,3], [4,3], [1,1] ])
label = np.array([1,1,-1])
classify = Perceptron(data, label)
classify.training()
评论 (0)