每天进步一点点《ML - 感知机》

一些前提的约定,还是沿用上篇文章的哈。先来致敬下男神。
在这里插入图片描述

一:感知机
感知机是一种线性二分类模型,其目的是找到能将训练数据线性可分的分离超平面。超平面线性模型为
在这里插入图片描述

联想起之前学到逻辑斯特回归的决策边界,Z = θ^T X , 当Z>0的时候,预测是1,当Z<0的时候,预测是0,有木有感觉跟感知机很类似啊,而且这个线性表达式,可以把b看做是θ^0, x(0)看做是1。那么其实在线性表达式上是和θ^T X一样的。
但是也仅仅只是类似,不是完全相同的,不同之处在于,逻辑回归是基于概率模型的,其激活函数是sigmoid函数,其值在0~1之间,为了分类就将y=h(x) > 0.5的样本归为1,y=h(x) < 0.5的样本归为0。而感知机不是基于概率模型,完全就是空间几何内的超平面划分,在超平面的一边是正样本(+1),在另一边是负样本(-1),其激活函数为y=sign(x) ,sign函数是一个单位阶跃函数,凡是x>0的,样本都是认为是(+1),小于0的都是认为是(-1)。因为感知机的模型如下:

在这里插入图片描述

在一些概念上,我们也说明下,在二维空间内,其超平面是一条直线,在三维空间下,其超平面是个平面,在跟高维度空间下,我们画不出来,我们就理解是一个线性的超平面。
其中w和b 称为模型的参数,w∈Rn称为权值,b 称为偏置,w⋅x 表示 w和x 的内积。诶?多说一两句,内积呢就是一个向量A在另一个向量B上的投影的长度乘以向量B的长度,下一篇文章讲解SVM的时候能用到,下面我还会画图继续讲解。

二:感知机详解
在这里插入图片描述

w⋅x 表示 w和x 的内积,用二维坐标简要介绍下,x=(x1,x2),w=(w1,w2),看做是两个向量,x在w向量的投影向量是p,长度是‖p‖。因此 w⋅x = ‖x‖cos⁡(θ) ‖w‖ 。在超平面内,这个投影是有方向的,也就是取决于cos⁡(θ)的正负而已。
下面我们来看看那个超平面的表现:
在这里插入图片描述

在图中有红色的线就是我们的分类超平面,有两类样本,红色样本和蓝色样本,红色的线条是二维空间的超平面,蓝色的向量则是w是超平面的法向量,同x向量是正交的。所以每个样本要么在超平面的上方,要么在超平面的下方,也就是一边是(+1)的样本,一边是(-1)的样本。每个样本到超平面的举例,也就是在w向量上的投影,要么是正值,要么是负值。

三:代价函数:
由于感知机的激活函数是sign函数,单位阶跃函数,因此,给定某样本(X(i), Y(i)).,如果该样本能够被正确分类,那么可得到 ,(wx+b)* Y(i) > 0 , 相反,如果该样本被错误分类,正样本被预测为了负样本,负样本被预测为了正样本,那么可得,(wx+b)* Y(i) < 0。
因此,代价函数为
在这里插入图片描述

我们想的是,正确分类的样本,其代价值误差值为0,不做任何统计,只统计错误的样本集合,也就是错误分类的样本。M表示分类错误了的样本集合,分类错误了的样本(wx+b)* Y(i) < 0,由于我们习惯上是去最小化代价函数,因此乘以了-1,转成了最小化,其实吧,最大化和最小化,是可以相互转化的,就是乘以-1就转换了过来。这个在之前我讲解的那个极大似然和逻辑回归的代价函数关系的时候,也有这样的操作。
直观上是,错误分类的样本越多,代价函数越值大,其次呢,单个样本的误差值越大,,代价函数越值大。By the way,为啥这里没有体现单位阶跃函数?人家逻辑回归里面有是有sigmoid函数的。那是因为单位阶跃函数没有连续可导性,在0处不连续。其实吧,考虑代价函数,说白了也就是找到某个数学估算模型,用来估算你模型预测的准确度,怎么衡量这个准性的呢,没有统一标准,衡量准确度就行,最好呢还是可求导的(数学书很多很多求最优解/极值的解法都是设计求导)。
好了,代价函数给了,那么下一步就是最小化这个代价函数,我们还是用梯度下降法来表示。
在这里插入图片描述

这一步也很简单,自行推导即可,不多于赘述。感知机采用的是随机梯度下降法,也就是每次拿一个分错类的误差点进行梯度下降,因此上述式子就成了
在这里插入图片描述

综合一下,梯度下降变成了:
在这里插入图片描述

我建议是把 wx+b 化成Z = θ^T X的形式,b=θ0,x(0) = 1,方便向量化运算。

四:举例说明
Y = wx+b 化成在二维坐标下x=(1, x1, x2), θ=(θ0, θ1, θ2),
给出几个分类点,找出一条可区分的面。

clc;clear all;close all;
set(0,'defaultfigurecolor','w') ;

src_x1 = [1.3,1.35,1.4,1.45,1.5,     1.32,1.33,1.42,1.43,1.46];
src_y1 = [3.32, 3.15, 3.12, 3.41, 3.26    ,3.3, 3.5, 3.2, 3.4, 3.6];
src_x2 = [3.3, 3.35, 3.4, 3.45, 3.5,  3.32,3.352,3.42,3.47,3.52];
src_y2 = [5.3, 5.5, 5.2, 5.4, 5.6,    5.32, 5.35, 5.24, 5.34, 5.61];

src_x = [src_x1, src_x2];
src_y = [src_y1, src_y2];
tag = [-ones(1, size(src_x1)(2)), ones(1, size(src_x2)(2))];

x = [ones(size(src_x)(2), 1), src_x', src_y'];
y = tag';
theta = (0.1* ones(3, 1));

itr = 100; %iteration times
rate = 0.02; %step
cost = zeros(1, itr);
for it=1:itr

	tmp_result = x*theta;
	
	% find every mistake sample
	for i=1:1:size(tmp_result)(1)
		tmp = sign(tmp_result(i, 1)) * y(i, 1);
		if tmp < 0
			% compute the cost value
			cost(it) += -(tmp_result(i, 1) * y(i, 1));
			
			% update each theta
			theta += rate .* y(i, 1) * x(i, :)';
		end;
	end;

end;


figure();
subplot(1,2, 1);
hold on;

% 打点,画决策边界
scatter(src_x1, src_y1, 'b', 'linewidth', 3);
scatter(src_x2, src_y2, 'r', 'linewidth', 3);
xx = [0:0.1:6];
plot(xx, -((theta(1)/ theta(3)) + (theta(2)/theta(3)) .* xx), 'g', 'linewidth', 3);
xlim([0,6]);
ylim([2,6]);
%axis equal;
grid on;
xlabel('x1');
ylabel('x2');

% 画代价函数跟随迭代次数的收敛曲线
subplot(1,2, 2);
xx = (1:1:itr);
scatter(xx, cost, 'p', 'linewidth', 3);
xlim([0,itr]);
ylim([0,100]);
%axis equal;
grid on;
hold on;
xlabel('iteration times');
ylabel('cost value');

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值