knitr::opts_chunk$set(echo = TRUE)
台大《机器学习基石》第二周课的笔记,只整理部分重要内容。希望能把课上学的,做一个精简的记录。
变量说明
存在两类数据,标记为y,取值为
迭代过程
PLA采取知错就改的策略。遍历所有样本,如果发现分类错误,采用如下方式如下方式更新
Fort=0,1,...N1.findamistakeofwtcalled(xn(t),yn(t))sign(wTtxn(t))≠yn(t)2.(tryto)correctthemistakebywt+1←wt+yn(t)xn(t)...untilnomoremistakesreturnlastw(calledwPLA)asg
更新理由
判断类别的公式:
sign(wTtxn(t))=sign(∥∥wTt∥∥∥∥xn(t)∥∥cos(θ))
如果正类被误判,则cos(θ)<0,即θ∈(π2,π),所以要缩小法向量和特征向量之间的夹角。故采用上图方法迭代w的值。
证明
证明线性可分数据集,PLA算法一定能够经过有限次的迭代,得到一个完美的分割超平面。
每一次迭代wt 更接近wf
1. wf为完美分类器
2. (xn,yn)为错分的样本
3. (xn(t),yn(t))为第t次迭代时,wt错分的样本
因为wf是完美分类器,则一定有:
yn(t)wTfxn(t)≥minnynwTfxn>0
利用任意一个错判样本(xn(t),yn(t))进行第t+1次迭代之后,计算:
wTfwt+1∥∥wTf∥∥∥wt+1∥=wTf(wt+yn(t)xn(t))∥∥wTf∥∥∥wt+1∥=wTfwt+yn(t)wTfxn(t)∥∥wTf∥∥∥wt+1∥≥wTfwt+minnyn(t)wTfxn(t)∥∥wTf∥∥∥wt+1∥>wTfwt+0∥∥wTf∥∥∥wt+1∥=wTfwt∥∥wTf∥∥∥wt+1∥
从余弦相似度的角度看,通过错判样本对wt的修正,使得迭代后的w更接近于完美的分割超平面。
每一次迭代wt 的模增长较小
∥wt+1∥2=∥∥wt+yn(t)xn(t)∥∥2=∥wt∥2+2yn(t)wTtxn(t)+∥∥yn(t)xn(t)∥∥2≤∥wt∥2+0+∥∥yn(t)xn(t)∥∥2≤∥wt∥2+maxn∥ynxn∥2
迭代次数有限
假设w0=0,经过T次迭代之后:
所以迭代次数T有上界。
案例
构造数据集
构造数据集,验证算法。
x11 <- 1:10
x21 <- x11 + runif(10, 0, 1) + 3
x22 <- x11 - runif(10, 0, 1)
example_data <- data.frame(x1 = rep(x11, 2),
x2 = c(x21, x22),
label = rep(c(1, -1), each = 10))
example_data$label <- as.factor(example_data$label)
library(ggplot2)
ggplot(data = example_data, aes(
x = x1,
y = x2,
color = label,
shape = label
)) +
geom_point()
PLA算法
求解
w_data <- PLA_f(dataset = example_data, label = "label")
w_data
x0 x1 x2 slope intercept
1 1 1 1.000000000 -1.0000000 -1.0000000
2 0 0 0.495471116 0.0000000 0.0000000
3 -1 -1 -0.009057768 -110.4024725 -110.4024725
4 0 0 4.912654036 0.0000000 0.0000000
5 -1 -1 4.408125152 0.2268538 0.2268538
6 -2 -2 3.903596268 0.5123481 0.5123481
7 -3 -4 1.915120282 2.0886417 1.5664812
8 -2 -1 8.363856425 0.1195621 0.2391241
9 -3 -2 7.859327541 0.2544747 0.3817120
10 -4 -4 5.870851555 0.6813322 0.6813322
11 -5 -9 1.747566727 5.1500179 2.8611211
12 -4 -8 6.669278532 1.1995300 0.5997650
动图
Ref
[1]课程PPT
2017-12-19于杭州