这一节我们介绍机器学习课程当中的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与逻辑回归的关系
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');