复习(机器学习的流程)
- 有一个未知的映射 f : X → Y f: X \to Y f:X→Y(上次的案例是信用卡)
- 训练集 D : ( x 1 , y 1 ) , . . . , ( x N , y n ) D: (x_1,y_1),...,(x_N,y_n) D:(x1,y1),...,(xN,yn)(银行的历史记录)
- 有一个假说集 H H H,从中得到了学习算法 A A A
- 最后的假说 g ≈ f g \approx f g≈f
从一个简单的数据集入手,学习感知器
-
现在这里有一个银行用户的数据
-
对于某一个用户,定义一个 x = ( x 1 , x 2 , . . . , x d ) x = (x_1,x_2,...,x_d) x=(x1,x2,...,xd)向量,每个维度对于结果可能有不同的影响。
-
其实这和考试是一样的,你有不同的题型,每个题型有不同的重要性,自然分数占比的权重就不一样,最后加权,得到一个等级,来判断你是否“及格”,“普通”,“优秀”之类的。本质上考卷就是一个感知器(perceptron)
-
我们做的就是算分评级。
-
y : { + 1 ( g o o d ) , − 1 ( b a d ) } 0 , i g n o r e d l i n e a r f o r m u l a h ∈ H a r e h ( x ) = s i g n ( ( ∑ I = 1 d w i x i ) − t h r e s h o l d ) y:\{ +1(good),-1(bad)\} 0, ignored\space linear\space formula\space h\in H\space are\\h(x) = sign((\sum^d_{I=1}{\color{red}w_i}x_i)-{\color{red}threshold}) y:{+1(good),−1(bad)}0,ignored linear formula h∈H areh(x)=sign((I=1∑dwixi)−threshold)
-
我们做一些简化
h ( x ) = s i g n ( ( ∑ I = 1 d w i x i ) − t h r e s h o l d ) h(x) = sign((\sum^d_{I=1}{\color{red}w_i}x_i)-{\color{blue}threshold}) h(x)=sign((I=1∑dwixi)−threshold)
-
(latex不会打下括号哈哈)
-
就是一个符号的变动,把阈值视为 w 0 w_0 w0,正负视为 x 0 x_0 x0
-
最后的 w w w和 x x x都是一个高高的向量。
R 2 R^2 R2的感知器
h
(
x
)
=
s
i
g
n
(
w
0
+
w
1
x
1
+
w
2
x
2
)
h(x) = sign(w_0+w_1x_1+w_2x_2)
h(x)=sign(w0+w1x1+w2x2)
- 我们假设,现在顾客只有两个特征,那么我们就可以把上面的公式画成这幅图。
- (当然,如果多维的就另说,就是二维的我们比较好理解一些)
- 圈和叉来源于什么呢?实际上来源于这个结果的正负。正用蓝色的圈代替,负用红色的叉代替。
- 如果令 h ( x ) = 0 h(x) = 0 h(x)=0,把它画出来就是一条直线。
- 0代表就是“发信用卡”和“不发信用卡”的边界。
- 如果从几何的角度来看,“感知器”本质上就是一个线性分类器
- 在高维上,分类的线事实上就是一个高维平面,本质上和一条线是一样的。
总结与展望
- 那么我们现在就掌握到, H H H这个感知器,就是形成 g ≈ f g\approx f g≈f的一个选项。
- 我们要怎么设计一个算法,怎么选一条最好的线(和w有关)。
- 那条最好的线就是最接近f的线。
- 在数学上,表现g和f接近可以用这样表示 g ( x n ) ≈ f ( x n ) = y n g(x_n) \approx f(x_n) = y_n g(xn)≈f(xn)=yn
- 这代表所有已知的 f ( x n ) f(x_n) f(xn)和 g ( x n ) g(x_n) g(xn)“一样”。(保证所有的数据得到的结果在已有结果的资料是准确的)
如何选择一条分类面
- 遍历所有的线?(太复杂了)
- 随机选择一条线,一直修正他,不断地让它变得更好。
- 算法:开始迭代
- 在 w t w_t wt处犯了错误,那个错误的位置点是 ( x n ( t ) , y n ( t ) ) {\color{blue} (x_{n(t)},y_{n(t)}) } (xn(t),yn(t)) s i g n ( w t T x n ( t ) ) ≠ y n ( t ) sign(w_t^Tx_{{n(t)}})\not =y_{n(t)} sign(wtTxn(t))=yn(t)
- 尝试通过这条式子修正错误(在坑爹的一大段知识补充那里会详细讲为什么这条式子可以修正错误)
w
t
+
1
←
W
t
+
y
n
(
t
)
x
n
(
t
)
w_{t+1}\leftarrow W_t+y_{n(t)}x_{n(t)}
wt+1←Wt+yn(t)xn(t)直到修正得最好为止。
- 大概的感觉是这样的(埋下伏笔)
- 这个算法被叫做PLA(Perceptron learning algorithm)
- 最后得到的就是w
- A fault confessed is half redressed(知错能改善莫大焉)
- 怎么判断没有错误
- 遍历所有的点,看看有哪些犯了错,犯了错就修正,然后继续。
坑爹的一大段知识补充
- 这课漏掉了非常重要的一个内容,就是为什么迭代算法的式子是写成: w t + 1 ← W t + y n ( t ) x n ( t ) w_{t+1}\leftarrow W_t+y_{n(t)}x_{n(t)} wt+1←Wt+yn(t)xn(t)
- 首先我们往回看,我们的超平面方程是什么: w ⋅ x + b = 0 w\cdot x+b = 0 w⋅x+b=0
- 上面把b写成了 w 0 x 0 w_0x_0 w0x0,也是可以的,这里我们把它分开。
- 那么理想的来说,对于所有 y i = + 1 y_i = +1 yi=+1的结果来说 w i + b > 0 w_i+b>0 wi+b>0,反之亦然,这是一个线性可分数据集。(linearly separable data set)
- 假设数据集线性可分,那么感知器的学习目标是求得一个超平面。
- 为了找出超平面,即确定感知器模型参数 w , b w,b w,b,需要找到一个学习策略,定义损失函数并使其极小化
- 对于误分类的点, y i y_i yi和 w x i + b wx_i+b wxi+b异号!
- 所以对于误分类的点,有 − y i ( w ⋅ x i + b ) > 0 -y_i(w\cdot x_i+b)>0 −yi(w⋅xi+b)>0
- 那么对于误分类点集,当 L ( w , b ) = − ∑ x i ∈ M y i ( w ⋅ x i + b ) L(w,b) = -\sum_{x_i \in M}y_i(w\cdot x_i+b) L(w,b)=−xi∈M∑yi(w⋅xi+b)最小时,分类情况最好。
- 显然L是非负的,所以其实是L越靠近0,结果越好。
- 损失函数 L ( w , b ) L(w,b) L(w,b)是 w , b w,b w,b的连续可导函数.
- 那么咱们整个随机梯度下降算法就好啦!
- L(w,b)的梯度由 ∇ w L ( w , b ) = − ∑ x i ∈ M y i x i ∇ b L ( w , b ) = − ∑ x i ∈ M y i \nabla_w L(w,b)=-\sum_{x_i\in M}y_ix_i\\\nabla_b L(w,b)=-\sum_{x_i\in M}y_i ∇wL(w,b)=−xi∈M∑yixi∇bL(w,b)=−xi∈M∑yi给出
- 那么w的迭代公式为 w ← w + η y i x i w\leftarrow w+\eta y_ix_i w←w+ηyixi
- b的迭代公式为 b ← w + η y i b\leftarrow w+\eta y_i b←w+ηyi
- 之前看到别人博客写这个,说不知道该怎么正向思考的,现在看回来觉得有点喜感。
证明
(略)
一些小结
- 好处:
- 代码很简单,很好写。
- 坏处:
- 数据集D不一定是线性可分的。
- 根本就不知道什么时候会停。
尝试着去除噪声
- 我们需要尝试找到一条线是犯的错最少的。
- 我们最后的方程要形如: w g ← a r g m i n ∑ n = 1 N [ y ≠ s i g n ( W T x n ) ] w_g \leftarrow argmin\sum_{n = 1}^N [y\not = sign(W^Tx_n)] wg←argminn=1∑N[y=sign(WTxn)]
- 但这是一个NP完全问题的方程
Pocket algorithm(口袋算法)
- 其实就是不断迭代,设置一下迭代限制。
- 实时获得最好的线,然后存下来即可。
- 但是pocket算法需要不断地检查那条线比较好,这个是需要花一整次遍历的时间,这个还是挺慢的。