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 ...
随机推荐
- JAVA设计模式之【外观模式】
通过引入一个外观角色来简化客户端与子系统之间的交互. 顾客无需直接和茶叶.茶具.开水等交互,整个泡茶过程由服务员来完成,顾客只需与服务员交互即可. 通过引入一个外观角色可以降低原有系统的复杂度,同时降 ...
- apiCloud中Frame框的操作,显示与隐藏Frame
Frame是一层一层的概念, 有的位于上层,有的位于下层. 1.加载菜单 2.加载页面层 3.首页拆分出内容层,这个时候内容层位于页面层的上方,当点击其他页面的时候,内容层遮挡住了他们 解决方案一 判 ...
- event内存泄漏
C#内存泄漏--event内存泄漏 内存泄漏是指:当一块内存被分配后,被丢弃,没有任何实例指针指向这块内存, 并且这块内存不会被GC视为垃圾进行回收.这块内存会一直存在,直到程序退出.C#是托管型代码 ...
- Linux就该这么学 20181005(第九章SSH远程对话)
参考链接https://www.linuxprobe.com/ nmtui开启网卡设置 ONBOOT=yes systemctl restart network nmcli connection sh ...
- Android 国际区号注册手机号编码 以及常用城市列表
附上 国际区号编码:我是定义到arrays.xml里面了 <?xml version="1.0" encoding="utf-8"?> <re ...
- 微信小程序手势滑动卡片案例
最近工作中有项目要使用微信小程序技术进行开发,其中一项功能困扰了我很久,卡片滑动动效以及手势识别.经过一番研究和参考,现在把成果展示.记录自己踩到的坑,如果大家有需要,也可以帮助到大家. 效果图: 首 ...
- 一:1.2【print&input与变量和运算符】
[路径] 绝对路径:从根目录开始链接的路径 --->cd C:\Windows\Boot\DVD\EFI\en-US 相对路径:不从根目录开始链接的路径 ----> cd Boot\DV ...
- javascript位操作符右移>>>的妙用
var len=arr.length>>>0; 在arr.length为null或undefined的时间,强制转换为0;
- ORACLE数据库字符集处理
简介: ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,OR ...
- 今天遇到的一个诡异的core和解决 std::sort
其实昨天开发pds,就碰到了core,我还以为是内存不够的问题,或者其他问题. 今天把所有代码挪到了as这里,没想到又出core了. 根据直觉,我就觉得可能是std::sort这边的问题. 上网一搜, ...