Perceptron Learning Algorithm(python实现)
一、概论
对于给定的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实现)的更多相关文章
- 【Perceptron Learning Algorithm】林轩田机器学习基石
直接跳过第一讲.从第二讲Perceptron开始,记录这一讲中几个印象深的点: 1. 之前自己的直觉一直对这种图理解的不好,老按照x.y去理解. a) 这种图的每个坐标代表的是features:fea ...
- Perceptron Learning Algorithm (PLA)
Perceptron - 感知机,是一种二元线性分类器,它通过对特征向量的加权求和,并把这个”和”与事先设定的门槛值(threshold)做比较,高于门槛值的输出1,低于门槛值的输出-1.其中sign ...
- 线性模型(1):Perceptron Learning Algorithm (PLA)
此笔记源于台湾大学林轩田老师<机器学习基石><机器学习技法> (一) PLA算法是基本的binary Classification算法. 一个基本的问题是,对于银行,假设我知道 ...
- 感知机:Perceptron Learning Algorithm
感知机是支持向量机SVM和神经网络的基础 f = sign(wx+b) 这样看起来好像是LR是差不多的,LR是用的sigmoid函数,PLA是用的sign符号函数,两者都是线性分类器,主要的差别在于策 ...
- Machine and Deep Learning with Python
Machine and Deep Learning with Python Education Tutorials and courses Supervised learning superstiti ...
- Getting started with machine learning in Python
Getting started with machine learning in Python Machine learning is a field that uses algorithms to ...
- 【Machine Learning】Python开发工具:Anaconda+Sublime
Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...
- 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL
周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...
- 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 ...
随机推荐
- Android应用内加载pdf的方法?
[可行] 最直接的方式下载到本地, 然后调用相关应用打开 [可行,有局限] 使用 webview 加载, 需要在 原url 前面加上 http://docs.google.com/gview?url= ...
- DB-MySQL:MySQL 运算符
ylbtech-DB-MySQL:MySQL 运算符 MySQL 运算符 本章节我们主要介绍 MySQL 的运算符及运算符的优先级. MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运 ...
- 21.boost Ford最短路径算法(效率低)
到某个节点最近距离 最短路径当前节点的父节点 完整代码 #include <iostream> #include <string> #incl ...
- vue keep-alive保存路由状态1 (接下篇)
本文很长,但是很详细,请耐心看完就一目了然了有下篇 keep-alive 是 Vue 内置的一个组件,使被包含的组件保留状态,或避免重新渲染. 1. 基础用法,缓存所有路由: <keep-ali ...
- Java7里try-with-resources分析--转
原文地址:http://blog.csdn.net/hengyunabc/article/details/18459463 这个所谓的try-with-resources,是个语法糖.实际上就是自动调 ...
- Android ViewPager 动画效果
找到个不错的开源项目:https://github.com/jfeinstein10/JazzyViewPager Android ViewPager 动画效果
- SPOJ 1029 Matrix Summation【 二维树状数组 】
题意:二维树状数组,更改值的时候有一点不一样, 是将a[x][y]设置为一个值,所以add的时候要将它和以前的值作差一下 #include<iostream> #include<cs ...
- js&jQ判断checkbox表单是否被选中
js判断: if(document.getElementById("checkboxID").checked){ alert("checkbox is checked&q ...
- XML文件基础,DTD校验文件编写,Schema文件的简单使用
dtd <!-- <!ELEMENT 元素(子元素,...)> --> <!ELEMENT students (student+,cat*) > <!ELEM ...
- 用shell写一个简单DHCP配置脚本
轩轩写的这个小脚本,主要是可以进行对dhcp服务的安装.简单配置.开启.关闭/查看状态等情况 使用呢非常简单,按照步骤进行准确的设置就可以啦 #!/bin/bashyum -y install dhc ...