机器学习周志华- 第三章学习笔记 3.1-3.4

**本周学习了 3.1-3.5节 **

线性回归

线性回归问题就是试图学到一个线性模型尽可能准确地预测新样本的输出值

有时这些输入的属性值并不能直接被我们的学习模型所用,需要进行相应的处理,对于连续值的属性,一般都可以被学习器所用,有时会根据具体的情形作相应的预处理,例如:归一化等;对于离散值的属性,可作下面的处理:

若属性值之间存在“序关系”,则可以将其转化为连续值,例如:身高属性分为“高”“中等”“矮”,可转化为数值:{1, 0.5, 0}。

若属性值之间不存在“序关系”,则通常将其转化为向量的形式,例如:性别属性分为“男”“女”,可转化为二维向量:{(1,0),(0,1)}。

利用最小二乘法算w

image
image
image

image

image

MATLAB 实现数据回归分析

一元多项式线性回归 y=a1xm+a2xm-1+…+amx+am+1

最小二乘多项式拟合 [p,S]=polyfit(x,y,m)

matlab的polyfit命令,可以理解为“polynomial fitting”,用于数据的多项式拟合。
常用的几种命令格式:
1.P = POLYFIT(X,Y,N)
功能:在最小二乘法意义之上,求解Y关于X的最佳的N次多项式函数。返回值P为N+1维参数向量p(1),p(2)....所得的多项式为P(1)X^N + P(2)X^(N-1) +...+ P(N)*X + P(N+1)
2.[P,S] = POLYFIT(X,Y,N)
功能:(1)P的意义同1,是参数矩阵。S是规模为1×1的结构数组,包括R(系数矩阵的QR分解的上三角阵),df(自由度),normr(拟合误差平方和的算术平方根)

注意:

  1. 使用polyfit命令进行多项式拟合时要注意的是,向量X(其中元素作为自变量)中不重复的元素个数m,和拟合阶数k需要满足m>=k+1.简单分析:k阶拟 合需要确定k+1个未知参数(如1阶拟合y = ax + b需要确定a和b两个参数),故而至少需要k+1个方程,故而需要至少k+1个不同的已知数对(x,y),由于函数中x只能对应一个y,故而需要至少k+1个不同的x。
    以上只是帮助理解的粗略分析,仅供参考。
  2. polyfit只适合于形如y = a[k]x^k + a[k-1]x^(k-1) + .... + a[1]x + a[0]的完全的一元多项式的数据拟合*
    返回阶数为m 的多项式 p(x) 的系数,该阶数是 y 中数据的最佳拟合(在最小二乘方式中)。p中的系数按降幂排列,p 的长度为m+1

多项式y=a1xm+a2xm-1+…+amx+am+1

其中x=(x1,x2,…,xm),x1…xm为(n*1)的矩阵;

y为(n*1)的矩阵;

p=(a1,a2,…,am+1)是多项式y=a1xm+a2xm-1+…+amx+am+1的系数;

S是一个结构体数组(struct),用来估计预测误差,包含了R,df和normr。

R:polyfit函数中,先根据输入的x构建范德蒙矩阵V,然后进行QR分解,得到的上三角矩阵。

df:自由度,df=length(y)-(n+1)。df>0时,为超定方程组的求解,即拟合点数比未知数(p(1)~p(n+1))多。

normr:标准偏差、残差范数,normr=norm(y-V*p),此处的p为求解之后的数值。

image

多项式函数的预测值 Y=polyval(p,x)

p即为多项式拟合的系数
求polyfit所得的回归多项式在x处的预测值Y

p是polyfit函数的返回值;

x和polyfit函数的x值相同。

x=[10 20 30 40 50 60 70];
y=[0.63 0.76 0.80 0.82 0.82 0.80 0.70];
polytool(x,y,1)
[p,S]=polyfit(x,y,4);%p即为多项式拟合的系数
xi=(10:0.1:70);
yi=polyval(p,xi);
figure
plot(xi,yi,'k-')
hold on
plot(x,y,'r*')

image

红色圆圈:相应的置信区间
+加号:离散点
*星号:预测点

[Y,DELTA]=polyconf(p,x,S,alpha)

用于多项式评价和置信区间估计,对ployfit拟合的函数进行评价与估计。

Y=polyconf(p,x,s)使用polyfit函数的选项输出s给出Y的95%置信区间Y±DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数,1-alpha为置信度。

 
alpha缺省时为0.05。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。

其中参数:p是polyfit函数的返回值;x和polyfit函数的x值相同;S和polyfit函数的S值相同。

x=[10 20 30 40 50 60 70];
y=[0.63 0.76 0.80 0.82 0.82 0.80 0.70];
polytool(x,y,1)
[p,S]=polyfit(x,y,4);%p即为多项式拟合的系数
[Y,DELTA]=polyconf(p,x,S);
plot(x,y,'k+',x,Y,'r *',x,Y +DELTA,'r o ',x,Y -DELTA,'r o ')

image

polytool(x,y,m)

在图形上方可以更改degree的值,回车后下方图形也跟着改变。图形中我们可以看到两条红色的虚线和一条绿色的线。我觉得前者是置信区间的大小,后者当然是拟合曲线。选择红色曲线最靠近绿色曲线时的degree值作为多项式拟合的阶数,如图二,此处选择4。
image
image

多元二项式回归 (model)

rstool(x,y,’model’, alpha)

x为n*m矩阵

y为 n维列向量

model 由下列4个模型中选择1个(用字符串输入,缺省时为线性模型):
linear(线性):
purequadratic(纯二次):
interaction(交叉):
quadratic(完全二次):

alpha 显著性水平(缺省时为0.05)

返回值beta 系数

返回值rmse剩余标准差

返回值residuals残差

image

例如:

image

法一:选择纯二次模型 y=a0+a1 x1+a2 x2+a11 x1^2+a22 x2^2直接用多元二项式回归

y=[100 75 80 70 50 65 90 100 110 60]';
x1=[1000 600 1200 500  300 400 1300 1100 1300 300];
x2=[5 7 6 6 8 7 5 4 3 9];
x=[x1',x2'];
rstool(x,y,'purequadratic');

image
image

法二:y=a0+a1 x1+a2 x2+a11 x1^2+a22 x2^2化为多元线性回归

y=[100 75 80 70 50 65 90 100 110 60]';
x1=[1000 600 1200 500  300 400 1300 1100 1300 300];
X=[ones(10,1),x1',x2',(x1.^2)',(x2.^2)'];
[b,bint,r,rint,stats]=regress(y,X);
b,stats

image

多元线性回归 如y=b0+b1x1+……+bpxp

步骤

1.输入数据 2. regress回归分析及检验
3.rcoplot残差分析,作残差图
4.预测及作图

[b,bint,r,rint,stats] = regress(y,x, alpha)

命令regress多元线性回归(可用于一元线性回归)
[b,bint,r,rint,stats] = regress(y,x, alpha)

X为(ones(n,1),x1,…,xm)的矩阵;

Y为n*1的矩阵;

alpha——表示显著性水平(缺省时为0.05)

b——拟合线性函数的系数。

bint——系数b的置信区间。b的95%的置信区间矩阵。bint 置信区间不大,说明有效性较好;若含零点,说明结果无效。

r——残差向量(因变量的真实值减去估计值)

rint——返回残差的95%置信区间,它是一个2×n的矩阵,第1列为置信下限,第2列为置信上限。该矩阵可以用来诊断异常(即发现奇异观测值)。如果第i组观测的残差的置信区间RINT(i,:)所定区间没有包含0,则第i个残差在默认的5%的显著性水平比我们所预期的要大,这可说明第i个观测值是个奇异点(即说明该点可能是错误而无意义的,如记录错误等)

stats——R^2表示方差解释率 R^2越接近1说明数据拟合程度越好,回归方程越显著。

——F统计量用于检验模型是否通过检验。通过查F分布表,如果F>F分布表中对应的值,则通过检验。F F1-α(k,n-k-1)时拒绝H0,F越大,说明回归方程越显著;与F对应的概率p 时拒绝H0,回归模型成立。p值在0.01-0.05之间,越小越好。

——P为F 统计量对应的概率,越接近0越好,当P<α时拒绝H0,回归模型成立!!!

——第4个参数:SSE/(n-2) 不知何用

image


用于一元线性:

clear all;
x=[143 145 146 147 149 150 153 154 155 156 157 158 159 160 162 164]';
X=[ones(16,1) x];
Y=[88 85 88 91 92 93 93 95 96 98 97 96 98 99 100 102]';
[b,bint,r,rint,stats]=regress(Y,X);
%stats p<0.05 回归模型成立
%残差分析,作残差图
rcoplot(r,rint);
%除第二个数据外,其他数据的残差离零点均较近,且残差的置信区间均包含零点,该回归模型能较好符合原始数据,第二个数据为异常点
figure;
%预测及作图
z=b(1)+b(2)*x;
plot(x,Y,'k+',x,z,'r');

image
image
image

用于多元线性

x1=[7 1 11 11 7 11 3 1 2 21 1 11 10];
x2=[26 29 56 31 52 55 71 31 54 47 40 66 68];
x3=[6 15 8 8 6 9 17 22 18 4 23 9 8];
y=[78.5 74.3 104.3 87.6 95.9 109.2 102.7 72.5 93.1 115.9 83.8 113.3 109.4];
X=[ones(length(y),1),x1',x2',x3'];
Y=y';
[b,bint,r,rint,stats]=regress(Y,X);
rcoplot(r,rint);

image
image
image

残差分析:做残差图 rcoplot(r,rint)

画出残差及其置信区间

数组合并:
用空格或逗号则是按行合并在一起(行数不变,列数增加),用分号则是按列合并(列数增加,行数不变。

逐步回归法(交互式):stepwise(X,y,inmodel,alpha)

或者
stepwise(X,y,inmodel,penter,premove)penter ─模型检验的显著性水平上限值(缺省设置为0.05).
premoveb ─模型检验的显著性水平下限值(缺省设置为0.10).

它提供了一个交互式画面,在多元线性回归分析中,逐步回归法是对多个变量进行分析的有效方法。逐步回归的基本思想是逐个引入自变量,保留影响显著的变量,剔除影响不显著的变量,最终使得回归方程拟合度趋于完美。
采用stepwise函数能找到显著性影响因素

在Matlab中,函数stepwise的功能就是对需要分析的变量进行逐步回归,最后得出回归方程各个拟合信息。

其中X是自变量数据,y是因变量数据,分别为n×m和n×1矩阵

inmodel是矩阵的列数指标(缺省时为全部自变量)指明最初引入回归方程的解释变量

alpha,为显著性水平(缺省时为0.5).

红色表示变量移出回归方程,蓝色表示变量移入回归方程。首先应该点击红色数字处,把所有变量移入回归方程,再点击All Steps。

右边

Coeff 是 Xi 前面的估计系数

t-stat 是 系数的t值(t检验)

p-val 是 系数t检验中的p值

左边

红点是 估计系数

红线是 估计系数的上下界,如X1, 红线区间为【X1的β-se(β)a, X1的β+se(β)a】,a为t分布下的95%分位数

下面

Coeff.是回归系数
Intercept 为截距(常数项)

R-square是回归模型的判定系数,即拟合度,其等于1为完全拟合

Adj R-square 是调整的R^2

F是显著性检验的统计量,其大于Falpha(查表得)说明回归方程是显著的

p与显著性概率相关,要小于a,而且越接近与0越好

残差均方RMSE(这个值越小越好)

可以在最下方Model History处观察到RMSE(标准误差)最低的一次是第2次。点击2处的小圆点,可以得到一个新的窗口。

matlab会提示将哪个变量剔除如Move x3 out,点击 Next Step按钮,即,进行下一步运算,将变量x3剔除回归方程,继续点击 Next Step按钮,直到得到提示:Move No terms,即,没有需要加入(也没有需要剔除)的变量了。可以直接点击“All Steps”按钮,直接求出结果(省略中间过程)。

x1=[7 1 11 11 7 11 3 1 2 21 1 11 10]';
x2=[26 29 56 31 52 55 71 31 54 47 40 66 68]';
x3=[6 15 8 8 6 9 17 22 18 4 23 9 8]';
x4=[60 52 20 47 33 22 6 44 22 26 34 12 12]';
y=[78.5 74.3 104.3 87.6 95.9 109.2 102.7 72.5 93.1 115.9 83.8 113.3... 
    109.4]';
x=[x1 x2 x3 x4];
stepwise(x,y);

image
对回归方差进行显著性检验的p<0.05,说明整个回归方程是显著的。

这个最优的回归方程最终含有的变量有x1,x2,y= 52.5773+1.46831x1+0.66225x2

如果考虑常量及其他系数,也可用regress函数进一步做统计回归:

x=[ones(13,1),x1,x2];  [b,bint,r,rint,stats]=regress(y,x) 

结果为:y=52.5773+ 1.4683x1+ 0.6623x2
可见:与stepwise所得结果 y= 52.5773+1.46831x1+0.66225x2 相比,系数变化不大,吻合较好

逐步回归法 b = stepwisefit(X,y)

类似 stepwise函数

image

非线性回归 如y= ax1+bx2+cx3+dx4+ex5+fx6

步骤

1.对将要拟合的非线性模型建立m-文件 2.输入数据
3.nlinfit求回归系数 4.nlpredci预测及作图

[beta,r,j] = nlinfit(x,y,'model’,beta0)

X 为n*m矩阵

Y为 n维列向量

model是事先用m-文件定义的非线性函数

beta0是回归系数的初值,

beta是估计出的回归系数

r是残差

j是Jacobian矩阵,它们是估计预测误差需要的数据。

例如:

image
image

设国民收入、工业总产值、农业总产值、总人口、就业人口、固定资产投资分别为x1、x2、x3、x4、x5、x6,财政收入为y,设变量之间的关系为:
y= ax1+bx2+cx3+dx4+ex5+fx6
使用非线性回归方法求解。

function yy = model( beta0,X )
a=beta0(1);
b=beta0(2);
c=beta0(3);
d=beta0(4);
e=beta0(5);
f=beta0(6);
x1=X(:,1);
x2=X(:,2);
x3=X(:,3);
x4=X(:,4);
x5=X(:,5);
x6=X(:,6);
yy=a*x1+b*x2+c*x3+d*x4+e*x5+f*x6;
end
 X=[598 349 461 57482 20729 44;586 455 475 58796 
 21364 89;707 520 491 60266 21832 97;737
 558 529 61465 22328 98;825 715 556 62828 23018 
 150;837 798 575 64653 23711 139;1028 1235 598 
 65994 26600 256;1114 1681 509 67207 26173 
 338;1079 1870 444 66207 25880 380;757 1156 434 
 65859 25590 138;677 964 461 67295 25110 66;779 
 1046 514 69172 26640 85;943 1250 584 70499 
 27736 129;1152 1581 632 72538 28670 175;1322 
 1911 687 74542 29805 212;1249 1647 697 76368 
 30814 156;1187 1565 680 78534 31915 127;1372 
 2101 688 80671 33225 207;1638 2747 767 82992 34432 312;1780 3156 790 85229 35620 355;1833 3365 789 87177 35854 354;1978 3684 855 89211 
 36652 374;1993 3696 891 90859 37369 393;2121 
 4254 932 92421 38168 462;2052 4309 955 93717 
 38834 443;2189 4925 971 94974 39377 454;2475
 5590 1058 96259 39856 550;2702 6065 1150 97542 
 40581 564;2791 6592 1194 98705 41896 568;2927 
 6862 1273 100072 73280 496];
y=[184.00 216.00 248.00 254.00 268.00 286.00 357.00 444.00 506.00 ... 
    271.00 230.00 266.00 323.00 393.00 466.00 352.00 303.00 447.00 ... 
    564.00 638.00 658.00 691.00 655.00 692.00 657.00 723.00 922.00 ... 
    890.00 826.00 810.0]';
    
beta0=[0.50 -0.03 -0.60 0.01 -0.02 0.35];

[betafit,r,J] = nlinfit(X,y,'model',beta0);
[Y,delta]=nlpredci('model',X,betafit,r,J);
nlintool(X,y,'model',beta0);

image
image

nlintool(X,Y,’model’,beta0,alpha)

X 为n*m矩阵

Y为 n维列向量

model为自定义函数

beta0为估计的模型系数

alpha显著性水平(缺省时为0.05)

betaci=nlparci(beta,R,J)

beta为回归系数

R为残差

j是Jacobian矩阵,它们是估计预测误差需要的数据。

[y,delta] = nlpredci(’model’,x,beta,r,j)

y为预测值

delta为预测值的显著性为1-alpha的置信区间;

alpha缺省时为0.05。

X 为n*m矩阵

model为自定义函数

beta为回归系数

R为残差

j是Jacobian矩阵,它们是估计预测误差需要的数据。

x=2:16;
y=[6.42 8.20 9.58 9.5 9.7 10 9.93 9.99 10.49 10.59 10.60 10.80 10.60 10.90 10.76];
beta0=[8 2]';
[beta,r,J]=nlinfit(x',y','volum',beta0);
[Y,delta]=nlpredci('volum',x',beta,r,J);
plot(x,y,'k+',x,Y','r');

image

线性几率回归

对数几率引入了一个对数几率函数(logistic function),将预测值投影到0-1之间,从而将线性回归问题转化为二分类问题。
image
若将y看做样本为正例的概率,(1-y)看做样本为反例的概率,实际上使用线性回归模型的预测结果器逼近真实标记的对数几率。因此这个模型称为“对数几率回归”(logistic regression)

线性判别分析

线性判别分析(Linear Discriminant Analysis,简称LDA),其基本思想是:将训练样本投影到一条直线上,使得同类的样例尽可能近,不同类的样例尽可能远。想让同类样本点的投影点尽可能接近,不同类样本点投影之间尽可能远,即:让各类的协方差之和尽可能小,不用类之间中心的距离尽可能大。

基于这样的考虑,LDA定义了类内和类间散度矩阵。因此得到了LDA的最大化目标:“广义瑞利商”(generalized Rayleigh quotient)。从而分类问题转化为最优化求解w的问题,当求解出w后,对新的样本进行分类时,只需将该样本点投影到这条直线上,根据与各个类别的中心值进行比较,从而判定出新样本与哪个类别距离最近。

多分类学习

现实中我们经常遇到不只两个类别的分类问题,即多分类问题,在这种情形下,我们常常运用“拆分”的策略,通过多个二分类学习器来解决多分类问题,即将多分类问题拆解为多个二分类问题,训练出多个二分类学习器,最后将多个分类结果进行集成得出结论。最为经典的拆分策略有三种:“一对一”(OvO)、“一对其余”(OvR)和“多对多”(MvM),核心思想与示意图如下所示。
image
image
OvO:给定数据集D,假定其中有N个真实类别,将这N个类别进行两两配对(一个正类/一个反类),从而产生N(N-1)/2个二分类学习器,在测试阶段,将新样本放入所有的二分类学习器中测试,得出N(N-1)个结果,最终通过投票产生最终的分类结果。

OvM:给定数据集D,假定其中有N个真实类别,每次取出一个类作为正类,剩余的所有类别作为一个新的反类,从而产生N个二分类学习器,在测试阶段,得出N个结果,若仅有一个学习器预测为正类,则对应的类标作为最终分类结果。

MvM:给定数据集D,假定其中有N个真实类别,每次取若干个类作为正类,若干个类作为反类(通过ECOC码给出,编码),若进行了M次划分,则生成了M个二分类学习器,在测试阶段(解码),得出M个结果组成一个新的码,最终通过计算海明/欧式距离选择距离最小的类别作为最终分类结果。

补充

pause命令

pause:导致M文件的停止,等待用户按任意键继续运行

pause==(n):此用法将在继续执行前中止执行程序n秒,这里n可以是任意实数。时钟的精度是由MATLAB的工作平台所决定的,绝大多数工作平台都支持0.01秒的时间间隔。

pause on:此用法将允许后续的pause命令中止程序的运行。

pause off:此用法将保证后续的任何pause或pause(n)语句都不中止程序的运行。

要编写在m文件中,写在命令窗口是不管用的,与ctrl+c不同。

grid命令

grid on是打开网格

grid off是关闭网格

而grid是切换两种状态,如果在grid off的状态下,输入grid,相当于grid on

相反,如果在grid on状态下输入grid 等价于grid off

posted @ 2017-08-31 00:52  于繁华求淡然  阅读(1657)  评论(0编辑  收藏  举报