PLA算法和Pocket算法原理及Python实现

本文详细介绍了 PLA 和 Pocket 算法的原理,通过Python实现这两种算法,并在线性可分与不可分数据集上进行对比。Pocket算法在遇到错误点时保存最优解,能有效解决PLA对于线性不可分数据集的问题。
摘要由CSDN通过智能技术生成

算法原理

1.PLA算法原理

PLA算法首先随机选择一条直线进行分类。然后找到第一个分类错误的点,如果这个点表示正类,被误分为负类,则,那表示w和x夹角大于90度,其中w是直线的法向量。所以,x被误分在直线的下侧(相对于法向量,法向量的方向即为正类所在的一侧),修正的方法就是使w和x夹角小于90度即。通过一次或多次更新后的w与x夹角小于90度,能保证x位于直线的上侧,则对误分为负类的错误点完成了直线修正。

同理,如果是误分为正类的点,即, ,那表示w和x夹角小于90度,其中w是直线的法向量。所以,x被误分在直线的上侧,修正的方法就是使w和x夹角大于90度即。通过一次或多次更新后的w与x夹角大于90度,能保证x位于直线的下侧,则对误分为正类的错误点也完成了直线修正。

按照这种思想,遇到个错误点就进行修正,通过不断迭代,每次根据分类错误点进行参数调整,如果数据线性可分,在经过有限次迭代之后,PLA就会停止,数据被正确的分类。

2.Pocket算法原理

Pocket算法是PLA算法的改进,算法原理基本相似,不同之处在于当遇到分类错误的点时,Pocket算法会随机挑选分类错误的点进行修正,修正方法与PLA一样,但Pocket会保存当前最优参数,并与修正之后的参数进行结果比较,如果修正之后的参数结果更好(即分类错误的点更少)则将修正之后的参数保存成当前最优解。如果数据线性可分并迭代次数足够大,通过Pocket算法是一定能找到正确的线将数据正确分类,如果数据不是线性可分,Pocket算法在迭代相应的次数时,算法便会停止。

数据集与代码

具体代码和数据请去https://github.com/xiaotianming/machine-learning/tree/master/PLA%20and%20Pocket
下载查看

算法实现与对比

1.设计数据集

线性可分数据集:

我通过python的随机数函数生成[0,10]的数据,然后通过直线x+y=10的直线来进行分类,在直线上方数据点的label为1,在直线下方数据点的label为-1。

线性不可分数据集:

线性不可分数据生成过程与上面一样,但在生成最后4个数据点时,全部标记为-1,但这存在着一定的随机性,不能保证数据一定线性不可分。

2.算法实现

PLA算法:

import numpy as np
import pandas as pd
import time
import matplotlib.pyplot as plt


# 1、导入数据集
def loaddata():
    data1 = pd.read_csv("data1.csv",header = None)
    samples = data1.iloc[:,:2].values
    labels = data1.iloc[:,2].
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值