一、概论

对于给定的n维(两种类型)数据(训练集),找出一个n-1维的面,能够“尽可能”地按照数据类型分开。通过这个面,我们可以通过这个面对测试数据进行预测。

例如对于二维数据,要找一条直线,把这些数据按照不同类型分开。我们要通过PLA算法,找到这条直线,然后通过判断预测数据与这条直线的位置关系,划分测试数据类型。如下图:



二、PLA的原理

先初始化一条直线,然后通过多次迭代,修改这条直线,通过多次迭代,这条直线会收敛于接近最佳分类直线。

修改直线的标准是,任意找出一个点(训练数据中的某个点),判断这个点按照这条直线的划分类型是否跟该点实际类型是否相同。如果相同则开始下次迭代;如果判断错误,则更新直线的参数。

三、W的更新步骤



期中W为直线的参数矩阵。y为该点的实际类型,x为该点的参数矩阵。

假设有一下测试数据:



第1、2个位向量参数,第三个为截距值。

这几个测试数据集的类型表现为:



求出以下的测试集的类型:



假设W的初始化值为:

第一次选择E点来更新W的值:



其中sign的符号函数,sign(x)当x的值大于0是sign(x)=+1,否则为-1。(这里+1,-1分别表示两种标签类型)

如上面公式求出来的结果是+1类型,而真实值为预测值跟真实值不一样,所以需要更新W的值:

四、python实现

1、初始化W的值和迭代次数:

ITERATION = 70;
W = [1, 1, 1];

2、读取训练、测试数据,生成训练、测试(二维)列表:

def createData():
lines_set = open('../data/PLA/Dataset_PLA.txt').readlines();
linesTrain = lines_set[1:7]; #测试数据
linesTest = lines_set[9:13]; #训练数据 trainDataList = processData(linesTrain); #生成训练集(二维列表)
testDataList = processData(linesTest); #生成测试集(二维列表)
return trainDataList, testDataList; def processData(lines): #按行处理从txt中读到的训练集(测试集)数据
dataList = [];
for line in lines: #逐行读取txt文档里的训练集
dataLine = line.strip().split(); #按空格切割一行训练数据(字符串)
dataLine = [int(data) for data in dataLine]; #字符串转int
dataList.append(dataLine); #添加到训练数据列表
return dataList;

3、两个矩阵相乘的结果求符号函数值:

def sign(W, dataList):      #符号函数
sum = 0;
for i in range(len(W)):
sum += W[i] * dataList[i];
if sum > 0: return 1;
else: return -1;

如果各项相乘的和比0大则返回+1,否则返回-1;

4、检测测试的类型是否跟真实标签类型一样

def renewW(W, trainData):   #更新W
signResult = sign(W, trainData);
if signResult == trainData[-1]: return W;
for k in range(len(W)):
W[k] = W[k] + trainData[-1]*trainData[k];
return W;

如果相等,则不更新W的值,否则按公式 W[k] = W[k] + trainData[-1]*trainData[k];更新W的值,返回W的新值。

5、通过多次迭代,训练W的值

def trainW(W, trainDatas):  #训练W
newW = [];
for num in range(ITERATION):
index = num % len(trainDatas);
newW = renewW(W, trainDatas[index]);
return newW;

经过多次迭代后,W的值会收敛于某个值。

6、使用训练后的W对测试集进行分类(预测)

def predictTestData(W, trainDatas, testDatas):  #预测测试数据集
W = trainW(W, trainDatas);
print W;
for i in range(len(testDatas)):
result = sign(W, testDatas[i]);
print result;

五、完整代码

ITERATION = 70;
W = [1, 1, 1]; def createData():
lines_set = open('../data/PLA/Dataset_PLA.txt').readlines();
linesTrain = lines_set[1:7]; #测试数据
linesTest = lines_set[9:13]; #训练数据 trainDataList = processData(linesTrain); #生成训练集(二维列表)
testDataList = processData(linesTest); #生成测试集(二维列表)
return trainDataList, testDataList; def processData(lines): #按行处理从txt中读到的训练集(测试集)数据
dataList = [];
for line in lines: #逐行读取txt文档里的训练集
dataLine = line.strip().split(); #按空格切割一行训练数据(字符串)
dataLine = [int(data) for data in dataLine]; #字符串转int
dataList.append(dataLine); #添加到训练数据列表
return dataList; def sign(W, dataList): #符号函数
sum = 0;
for i in range(len(W)):
sum += W[i] * dataList[i];
if sum > 0: return 1;
else: return -1; def renewW(W, trainData): #更新W
signResult = sign(W, trainData);
if signResult == trainData[-1]: return W;
for k in range(len(W)):
W[k] = W[k] + trainData[-1]*trainData[k];
return W; def trainW(W, trainDatas): #训练W
newW = [];
for num in range(ITERATION):
index = num % len(trainDatas);
newW = renewW(W, trainDatas[index]);
return newW; def predictTestData(W, trainDatas, testDatas): #预测测试数据集
W = trainW(W, trainDatas);
print W;
for i in range(len(testDatas)):
result = sign(W, testDatas[i]);
print result; trainDatas, testDatas = createData(); predictTestData(W, trainDatas, testDatas);

六、数据集



第一列为向量的第一个参数,第二列为第二个参数,第三列为截距值,(训练集)第四列为真实标签类型。

Perceptron Learning Algorithm(python实现)的更多相关文章

  1. 【Perceptron Learning Algorithm】林轩田机器学习基石

    直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:fea ...

  2. Perceptron Learning Algorithm (PLA)

    Perceptron - 感知机,是一种二元线性分类器,它通过对特征向量的加权求和,并把这个”和”与事先设定的门槛值(threshold)做比较,高于门槛值的输出1,低于门槛值的输出-1.其中sign ...

  3. 线性模型(1):Perceptron Learning Algorithm (PLA)

    此笔记源于台湾大学林轩田老师<机器学习基石><机器学习技法> (一) PLA算法是基本的binary Classification算法. 一个基本的问题是,对于银行,假设我知道 ...

  4. 感知机:Perceptron Learning Algorithm

    感知机是支持向量机SVM和神经网络的基础 f = sign(wx+b) 这样看起来好像是LR是差不多的,LR是用的sigmoid函数,PLA是用的sign符号函数,两者都是线性分类器,主要的差别在于策 ...

  5. Machine and Deep Learning with Python

    Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...

  6. Getting started with machine learning in Python

    Getting started with machine learning in Python Machine learning is a field that uses algorithms to ...

  7. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  8. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  9. do some projects in macine learning using python

    i want to do some projects in macine learning using python help me in this context I don't know if y ...

随机推荐

  1. silverlight wpf DataTemplate Command binding

    <Grid x:Name="LayoutRoot" Background="White"> <CommonControl:NoapDataGr ...

  2. angular4过滤器

    Angular4中过滤器 一.大小写转换过滤器 uppercase将字符串转换为大写 lowercase将字符串转换为小写 <p>将字符串转换为大写{{str | uppercase}}& ...

  3. Elasticsearch开发环境搭建(Eclipse\MyEclipse + Maven)

    前提是, Elasticsearch 编程API入门系列---说在前面的话 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) setting.xml配置文件 如何在M ...

  4. servlet中怎么注入service

    在工作中使用到spring的mvc框架,分为controller/service/dao三个层次.偶尔会用到servlet替换掉controller,这就遇到如何在servlet中使用注入到sprin ...

  5. GPG加密windows中使用

    在Windows系统使用Gpg4win进行加密解密 2015-06-15 by u014076884 GPG,又称为GnuPG,全称是Gnu Private Guard,即GNU隐私卫士.GPG是以P ...

  6. C++之易混淆知识点二

    1.数据抽象与封装 数据抽象是一种接口和实现相分离的编程技术,设计者关心的是如何实现这些接口,而使用者仅仅知道这些接口,抽象地考虑这些接口做什么的就可以了,不必去考虑如何实现这一层次. 封装是将低层次 ...

  7. 004.ES2015和ES2016新特性--块级作用域变量

    其基本原理就是JavaScript的作用域链,下面以对比的方式来展示一下函数级作用域和块级作用域. 函数级作用域 var fns = []; for (var i = 0; i < 5 ; i+ ...

  8. 【原创】Apache集群报Service Temporarily Unavailable的解决

    Apache的集群突然时不时的报出以下错误: Service Temporarily Unavailable The server is temporarily unable to service y ...

  9. C语言中的作用域、链接属性与存储属性

    C语言中的作用域.链接属性与存储属性 一.作用域(scope) 代码块作用域 表示{}之间的区域,下例所示,a可以在不同的代码块里面定义. #include<stdio.h> int ma ...

  10. 页面加载完成触发input[type="file"]控件问题

    由于浏览器厂家的限制,不同的浏览器不开放页面加载完成就允许触发input[type="file"]控件 测试 Chrome .火狐 .IE .微信客户端QQ =>桌面端: C ...