用python实现PLA算法和POCKET

您所在的位置:网站首页 pla算法详解 用python实现PLA算法和POCKET

用python实现PLA算法和POCKET

2024-07-11 11:54| 来源: 网络整理| 查看: 265

1. PLA算法python实现

pic1 为便于在二维空间中进行画图分析,构建二维感知机模型,即w和x均为二维向量,根据学习算法的原始形式,可以得出PLA算法的代码如下:

def PLA(): W = np.zeros(2) b = 0 count = 0 while True: count += 1 cease = True for i in range(0,len(dataset)): x = dataset[i][:-1] X = np.array(x) Y = np.dot(W,X) + b if sign(Y) == sign(dataset[i][-1]): continue else: cease = False W = W + (dataset[i][-1]) * X b = b + dataset[i][-1] if cease: break print("W:",W) print("count:",count) Display(dataset,W[0],W[1],b) return W

观察PLA可知,在数据集线性可分的情况下,PLA一定能停机; 在数据集线性不可分的情况下,对任意由w和b决定的线性划分,总存在某一点x使得wx+b != sign(y),故PLA将不会停机。

2. POCKET_PLA算法python实现

为使PLA算法可用于线性不可分的情况,引入容忍噪声的PLA算法,即POCKET_PLA算法,其主要思想如下:

初始化最优划分[w_best,b_best] 对整个数据集: 1 (随机)找到一个被分错的点(x , y) 2 尝试使用该点来修正当前划分 wt+1 = wt + y*x bt+1 = bt + y 3 如果修正后的划分 [wt+1,bt+1] 优于 [w_best,b_best] ,则将 [w_best,b_best] 更新为 [wt+1,bt+1]

循环直至 限定的循环次数(POCKET_PLA算法不会自行停机) 最终得到的[wt+1,bt+1] 即为最好的线性分类器

一言以蔽之,在POCKET_PLA算法中,保证每次 w_best 中存放的都是最优划分。

由以上思想可得 POCKET_PLA 的代码实现如下:

def POCKET_PLA(): count = 0 #count记录继上次找到一个更好的划分开始,已经走过的循环次数 W = np.ones(2) b = 0 best_W = W best_b = b #best_W和best_b共同记录当前最好的划分 min_num = 15 #min_num记录最好划分错误点的个数,初始化为全部点的个数 while True: count += 1 cease = True faultset = [] for i in range(0,len(dataset)): x = dataset[i][:-1] X = np.array(x) Y = np.dot(W,X) + b if sign(Y) == sign(dataset[i][-1]): continue else: cease = False faultset.append(dataset[i]) #该点分错,加入错误点集 if cease == False: j = random.randint(0,len(faultset)-1) #从被分错的点中随机选取一个并尝试修正 W = W + (faultset[j][-1]) * faultset[j][:-1] b = b + faultset[j][-1] num = num_fault(W,b,dataset) if num


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3