一、概论

对于给定的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. SICP 习题 (1.41)解题总结

    SICP 习题1.41 看似和周边的题目没有关系,突然叫我们去定义一个叫double的过程,事实上这道题的核心还是高阶函数. 题目要求我们定义一个过程double,它以一个过程作为參数,这个作为參数的 ...

  2. oracle 时间戳TIMESTAMP

    //数据库 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新时间戳 **/ private String updatetimestamp; //dao //插入操作 ...

  3. bzoj1202: [HNOI2005]狡猾的商人(差分约束)

    1202: [HNOI2005]狡猾的商人 题目:传送门 题解: 据说是带权并查集!蒟蒻不会啊!!! 可是听说lxj大佬用差分约束A了,于是开始一通乱搞. 设s[i]为前i个月的总收益,那么很容易就可 ...

  4. POJ 1945 暴搜+打表 (Or 暴搜+判重)

    思路: 呃呃 暴搜+打表 暴搜的程序::稳稳的TLE+MLE (但是我们可以用来打表) 然后我们就可以打表过了 hiahiahia 可以证明最小的那个数不会超过200(怎么证明的我也不知道),然后就直 ...

  5. Parquet学习总结

    深入分析Parquet列式存储格式 Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的 ...

  6. 简述Sql Server中常用的数据库对象(面试题)

    1.表(Table ) 数据库中的表与我们日常生活中使用的表格类似,它也是由行(Row) 和列(Column)组成的.列由同类的信息组成,每列又称为一个字段,每列的标题称为字段名.行包括了若干列信息项 ...

  7. 简易的CSS下拉菜单 - 1

    <!DOCTYPE html> <html> <head> <style> body{ margin:0; } .dropmenu{ backgroun ...

  8. Win10运行在哪里,Win10的运行怎么打开

    方法/步骤 1 唯一的方法是同时按下WIN+X键组合,如下图所示 步骤阅读 2 在弹出菜单可以看到运行了!如下图所示 步骤阅读 3 运行对话框出来了,如下图所示 步骤阅读 4 还有一个方法,点击桌面左 ...

  9. PostgreSQL 数据库性能调优的注意点

    PostgreSQL提供了一些性能调优的功能.主要有如下几个方面.1.使用EXPLAIN   EXPLAIN命令可以查看执行计划,这个方法是我们最主要的调试工具. 2.及时更新执行计划中使用的统计信息 ...

  10. vector迭代器

    https://www.cnblogs.com/quant-lee/p/6618829.html