这一节我们介绍机器学习课程当中的Generative Learning algorithms 生成学习算法,此算法与我们之前学习的逻辑回归等算法不太一样,它主要利用了贝叶斯公式为核心,也因此随后我们将引入朴素贝叶斯,贝叶斯网络等等算法,这些算法都在大数据时代大放异彩,体现出了贝叶斯思想的强大功能, 伯克利大学的Allen B. Downey教授专门有一本书叫《Think Bayes》挺不错的,值得好好研究一番,感兴趣的同学可以去看一看。
预备知识:统计学里面的均值,标准差,方差
均值描述的是样本点的平均状态,平均水平,或者说是中间点,标准差或者方差描述的是样本点到均值的平均距离,反应的是总体样本点的分散程度集中程度。之所以除以n-1而不是n,是因为这样能使我们以较小的样本集更好地逼近总体的标准差,即统计上所谓的“无偏估计”。(这里涉及到自由度方面的问题感兴趣可以谷歌一下,此不做详细介绍了就)
在日常的处理数据当中我们经常要面对多维的数据,例如一个班级里面的学生的多门功课成绩等等;而协方差就是这样一种用来度量两个随机变量关系的统计量,我们可以仿照方差的定义:
来度量各个维度偏离其均值的程度,协方差可以这样来定义:
协方差如果为正值,说明两者是正相关的(从协方差可以引出“相关系数”的定义),同时增加同时减小;如果结果为负值,说明两者是负相关,一个增加另一个减小;如果为0,则两者之间没有关系,也就是统计上说的“相互独立”。
协方差里面的一些性质:
协方差一般只能处理二维问题,那维数多了自然就需要计算多个协方差,比如n维的数据集就需要计算个协方差,自然而然我们会想到使用矩阵来组织这些数据。
我们举一个三维的例子,假设数据集有三个维度,则协方差矩阵为:
可见,协方差矩阵是一个对称的矩阵,而且对角线是各个维度的方差。
下面我们通过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)
首先第一个生成模型叫做Gaussian discriminant analysis (GDA)高斯判别分析:在GDA中我们认为p(x|y)分布服从多变量正太分布
N(µ,Σ) µ为均值向量,Σ为协方差矩阵,概率密度函数为:
均值:
分别对应的协方差矩阵为:
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的函数
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');