统计学习方法之感知机(Perception Mechine)

感知机(Perceptron)是一种简单的分类算法,只能用于数据集线性可分的情况。线性可分的意思是在欧几里得空间内,存在一个超平面可以将数据集分成两部分。在这里我刚好看了一眼逻辑回归(Logistic Regression)(PS:李航老师叫他逻辑斯提,其实是一个意思),都是分类方法,有什么区别呢?我发邮件问了徐悦甡老师,但是还没理我。我觉得区别就是:
1)感知机的要求比较高,必须是数据集线性可分的,而逻辑回归不要求。
2)感知机输出结果直接是类别,而逻辑回归输出的结果是该样本属于正向类的可能性大小。
3)感知机的代价函数用误判点到超平面的距离和表示,逻辑回归的用的是对数形式。(不用平方形式的原因之一是平方后不是凸函数,无法保证局部最优可以达到全局最优)
然后就到了实现算法实现环节。
具体原理什么的请看李航老师的《统计学习方法》第二章内容,本文只提供实现代码Matlab版(Java版过两天写一下)。
1 模型

f(x) = sign(W*X + b)

2 策略

deviation = sum(distance(f(x)-y)), x属于误判点集合
假设数据集为线性可分的,所以必存在[W,b]使deviation=0

3 算法

if yi*f(x) < 0
     W = W + alpha*yi*xi, alpha为学习率
     b  = b + alpha*yi
     具体原因请看《统计学习方法》P28,及梯度下降相关知识。
     因为第一次写博客,很多功能不会用,比如公式啥的,太难受了。T_T

一 原始形式的感知机

%matlab
%话说我一个程序员,竟然用matlab实现,竟然有些许惭愧,下午用java实现一把
%感知机的原始形式,
%每当某一个样本发生误判时就用当前样本点对W,b进行更新。
function [W, b] = perceptionMechine(X, Y, alpha)
  t = 0:0.1:max(X)
  n = size(X, 1);%the number of inputs
  m = size(X, 2);

  W = zeros(m, 1);  b = 0;%init
  deviation = 1;%用来判定是否存在误判点,存在则为1,否则为0

  while deviation ~= 0
    deviation = 0;
    for i=1:n
      pradict = X(i,: )*W+b;
      if (pradict)*Y(i) <= 0
        deviation = 1;
        W = W + alpha*Y(i)*X(i,: )';
        b = b + alpha*Y(i);
       end
    end
  end
end
吐槽一下,matlab的tab键缩紧是2个空格呀,,这颜色也不是很对呀,,第一次写博客,以后再改吧!tab之后变小是什么意思??

二 对偶形式

%感知机的对偶形式
%与原始形式不同之处在于,对偶形式的更新是对每个样本误判次数的更新
%?而原始形式是对向量W进行更新,故该模型效率更高一些
function [W, b] = AntperceptionMechine(X, Y, eta)
%输入分别为样本X,类型Y,学习率eta

%INIT
m = size(X, 2)%the number of attributes
n = length(Y) %the number of examples
times = zeros(n, 1) %误判次数矩阵
alpha = times*eta
W = zeros(m, 1)
b = 0
deviation = 1;%用来判定是否存在误判点,存在则为1,否则为0
Gram = X * X';

while deviation ~= 0 
    deviation = 0
    for i = 1:n
        prediction = sum(Gram(:,i).*alpha.*Y);
        prediction = prediction + b;
        if prediction*Y(i) <= 0 %如果误判
            deviation = 1;
            times(i) = times(i) + 1;%该样本误判次数加一
            b = b + Y(i) 
        end
    end
    alpha = times*eta;
end
W =  X'*(alpha.*Y)
b = alpha'*Y

三 测试集

%测试用例
x1 = [5 2; 1 3; 1 5; 1 8; 4 4 ]
y1 = [-1; -1; -1; -1; -1]
x2 = [11 5; 12 7; 9 10; 3 10; 4 7; 5 7]
y2 = [1; 1; 1; 1; 1; 1]
x = [x1; x2]
y = [y1; y2]

%画出两种样本
plot(x1(:, 1),x1(:, 2),'X')
hold on
plot(x2(:, 1),x2(:, 2),'O')

%分别划出两种边界线
t = 0:0.1:max(x)
[W, b] = perceptionMechine(x, y, 1)
plot(t, -((b+W(1)*t)/W(2)), 'r')
hold on
[W, b] = AntPerceptionMechine(x, y, 1)
plot(t, -((b+W(1)*t)/W(2)),'g')
legend('负向类','正向类', '原始形式感知机','对偶形式感知机');

统计学习方法之感知机(Perception Mechine)_第1张图片

你可能感兴趣的:(统计学习方法,算法)