MachineLearning—Generative Learning algorithms

    这一节我们介绍机器学习课程当中的Generative Learning algorithms 生成学习算法,此算法与我们之前学习的逻辑回归等算法不太一样,它主要利用了贝叶斯公式为核心,也因此随后我们将引入朴素贝叶斯,贝叶斯网络等等算法,这些算法都在大数据时代大放异彩,体现出了贝叶斯思想的强大功能, 伯克利大学的Allen B. Downey教授专门有一本书叫《Think Bayes》挺不错的,值得好好研究一番,感兴趣的同学可以去看一看。


预备知识:统计学里面的均值,标准差,方差

均值:clip_image002

标准差:image

方差:image


均值描述的是样本点的平均状态,平均水平,或者说是中间点,标准差或者方差描述的是样本点到均值的平均距离,反应的是总体样本点的分散程度集中程度。之所以除以n-1而不是n,是因为这样能使我们以较小的样本集更好地逼近总体的标准差,即统计上所谓的“无偏估计”。(这里涉及到自由度方面的问题感兴趣可以谷歌一下,此不做详细介绍了就)



在日常的处理数据当中我们经常要面对多维的数据,例如一个班级里面的学生的多门功课成绩等等;而协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:

clip_image002[6]

来度量各个维度偏离其均值的程度,协方差可以这样来定义:

clip_image002[8]

协方差如果为正值,说明两者是正相关的(从协方差可以引出“相关系数”的定义),同时增加同时减小;如果结果为负值,说明两者是负相关,一个增加另一个减小;如果为0,则两者之间没有关系,也就是统计上说的“相互独立”。

协方差里面的一些性质:

clip_image002[10]

clip_image002[12]

协方差一般只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算clip_image002[16]个协方差,自然而然我们会想到使用矩阵来组织这些数据。

我们举一个三维的例子,假设数据集有三个维度,则协方差矩阵为:

clip_image002[20]

可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差。


下面我们通过Matlab来实现计算协方差矩阵:

>> Mysample=fix(rand(10,3)*50)

Mysample =

    40     7    32
    45    48     1
     6    47    42
    45    24    46
    31    40    33
     4     7    37
    13    21    37
    27    45    19
    47    39    32
    48    47     8

>> d1=Mysample(:,1)             //类似于切片的功能

d1 =

    40
    45
     6
    45
    31
     4
    13
    27
    47
    48

>> d2=Mysample(:,2)

d2 =

     7
    48
    47
    24
    40
     7
    21
    45
    39
    47

>> d3=Mysample(:,3)                  //三列

d3 =

    32
     1
    42
    46
    33
    37
    37
    19
    32
     8

>> size(Mysample)

ans =

    10     3

>> size(Mysample,1)                   //第一个数

ans =

    10

>> size(Mysample,2)                    //第二个数

ans =

     3

>> d12=sum((d1-mean(d1)).*(d2-mean(d2)))/(size(Mysample,1)-1)      //一列 和 二列之间的协方差

d12 =

    78

>> d13=sum((d1-mean(d1)).*(d3-mean(d3)))/(size(Mysample,1)-1)       //一列 和 三列

d13 =

 -120.2444

>> d23=sum((d2-mean(d2)).*(d3-mean(d3)))/(size(Mysample,1)-1)       //二列 和 三列

d23 =

 -126.9444

>> var1=std(d1)^2                             // std()标准差

var1 =

  301.1556

>> var2=std(d2)^2

var2 =

  268.9444

>> var3=std(d3)^2

var3 =

  216.0111

>> 
>> cov(Mysample)

ans =

  301.1556   78.0000 -120.2444
   78.0000  268.9444 -126.9444
 -120.2444 -126.9444  216.0111

>> 


    下面我们正式进入生成学习模型Generative Learning algorithms的讲解:


    之前我们所了解到的机器学习算法大多都是这样的一种形式:p(y|x;θ) as hθ(x) =g(θTx); 也就是说通过特征,参数权重等来预测出类别标签y,这类的算法我们称之为discriminative learning algorithms;这里我们介绍另外一种形式的算法叫做generative learning algorithms生成学习算法,它的特点则是要:modelp(x|y);p(x|y= 0) 描述的是0类别情况下的特征分布,p(x|y= 1)描述的是1类别情况下的特征分布; 

这里的核心公式是:

       其中p(x) =p(x|y= 1)p(y= 1) +p(x|y=0)p(y= 0)

即转化为通过先验知识,已知条件计算出最终的分类y;



首先第一个生成模型叫做Gaussian discriminant analysis (GDA)高斯判别分析:在GDA中我们认为p(x|y)分布服从多变量正太分布


N(µ,Σ) µ为均值向量,Σ为协方差矩阵,概率密度函数为:


|Σ|表示协方差矩阵的行列式,
均值:

单独一个向量的协方差其实就是他的方差,Cov(Z) = E[(Z− E[Z])(Z− E[Z])T];所以也就有了Cov(Z) = E[ZZT]− (E[Z])(E[Z])T
所以一个向量时,他的协方差矩阵就是方差矩阵即: Cov(X) = Σ



左边的方差矩阵为Σ =I (the 2x2 identity matrix单位矩阵),称之为标准正态分布;中间的方差为Σ = 0.6I,可见方差变小之后分布变的更为集中了;右边的方差为Σ = 2I,方差变大之后分布变的更加分散了;


分别对应的协方差矩阵为:

     1代表    x        y 方向上的方差即离散程度

                  0代表相关程度为0,相互独立           0.5代表正相关         变大0.8代表正相关的更厉害,接近45°已经;极限1就是其自己




另外一组改变协方差的结果等高线图,对应的协方差矩阵为:


                      -0.5说明为负相关                                  -0.8说明更加负相关,接近135°              0.8正相关,3表示x方向离散程度加大


下图为改变均值向量的结果:




下面我们开始介绍GDA即高斯判别分析:

首先我们认为 y服从伯努利分布,即只有两种结果0或者1,而x服从多变量高斯分布。


就像是在逻辑回归当中,我们要最大化似然函数


得到结果:



高斯判别分析(GDA)最终就是要用两个高斯分布来描述代表两类样本,然后找到他们的最佳分类线;



高斯判别分析GDA与逻辑回归的关系

     其中θ 是φ, Σ, µ0, µ1的函数

我们发现GDA与逻辑回归LR是有很相似的形式的,但是我们应该选择哪一个呢?
p(x|y) 如果服从高斯分布,则p(y|x)一定符合逻辑回归,反之则不一定!这表明GDA似乎有更好的模型效果,事实上GDA确实也有更好的表现,但是例如x服从泊松分布时则p(y|x)一定是逻辑回归的,逻辑回归会有更好的表现;这时候如果非要用GDA则结果将不可预测可好也可坏。。。
注意吴恩达在这里说了一句话:requires less training data to learn “well”(GDA的情况下);GDA做了一个高斯分布的前提假设,而逻辑回归的假设则weaker一些,所以LR的模型能力鲁棒性更高,所以在确定非高斯情况下,数据量较大的情况下,LR拥有更广泛更好的应用;



下面是我们对 Gaussian Discriminate Analysis高斯判别分析的MATLAB实现:
Gaussian Discriminate Analysis
clc; clf;
clear all

% 随机产生2类高斯分布样本
mu = [2 3];
SIGMA = [1 0; 0 2];
x0 = mvnrnd(mu,SIGMA,500);  %利用随机产生的数据生成高斯分布
y0 = zeros(length(x0),1);
plot(x0(:,1),x0(:,2),'k+', 'LineWidth',1.5, 'MarkerSize', 7);
hold on;
mu = [7 8];
SIGMA = [ 1 0; 0 2];
x1 = mvnrnd(mu,SIGMA,200);
y1 = ones(length(x1),1);
plot(x1(:,1),x1(:,2),'ro', 'LineWidth',1.5, 'MarkerSize', 7)

x = [x0;x1];     %注意是分号不是冒号  表示按列合并为一列
y = [y0;y1];
m = length(x);

% 计算参数: \phi,\u0,\u1,\Sigma
phi = (1/m)*sum(y==1);
u0 = mean(x0,1);
u1 = mean(x1,1);
x0_sub_u0 = x0 - u0(ones(length(x0),1), :);   %500行1列 将u0纵向复制
x1_sub_u1 = x1 - u1(ones(length(x1),1), :);
x_sub_u = [x0_sub_u0; x1_sub_u1];
sigma = (1/m)*(x_sub_u'*x_sub_u);     %注意转置符号 横向量*列向量

%% Plot Result
% 画分界线,Ax+By=C
u0 = u0';     %u0 u1本都是行向量
u1 = u1';
a=sigma'*u1-sigma'*u0;  
b=u1'*sigma'-u0'*sigma';  
c=u1'*sigma'*u1-u0'*sigma'*u0;    % 分界线的确定:P(y=1|x)=p(y=0|x)=0.5 
A=a(1)+b(1);
B=a(2)+b(2);  
C=c;                              %<span style="font-family: Arial, Helvetica, sans-serif;">这几行代码我不太明白,到底是怎样由a,b,c得出A,B,C?不知哪位高手能指点一下啦......</span>
x=-2:10;  
y=-(A.*x-C)/B;  
hold on;  
plot(x,y,'LineWidth',2);

% 画等高线
alpha = 0:pi/30:2*pi;
R = 3.3;
cx = u0(1)+R*cos(alpha);           % R就是半径
cy = u0(2)+R*sin(alpha);
hold on;plot(cx,cy,'b-');
cx = u1(1)+R*cos(alpha);
cy = u1(2)+R*sin(alpha);
plot(cx,cy,'b-');

% 加注释
title('Gaussian Discriminate Analysis(GDA)');
xlabel('Feature Dimension (One)');
ylabel('Feature Dimension (Two)');
legend('Class 1', 'Class 2', 'Discriminate Boundary');









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值