您的位置:首页 > 其它

机器学习-学习笔记 学习总结归纳(第五周)

2017-07-14 19:32 447 查看

基本形式



例如绪论中的判断好瓜的算法,就可以用一个线性的模型来表示,好瓜 = 色泽 * 0.3 + 0.2 * 根 + 0.2 * 响声 == 1, 例如这样的线性模型来进行表示。

线性回归



我的理解就是,给定一个函数的一些输入输出,根据这些输入输出得到该函数的表达式。

最简单的例子就是给你二个点,求斜率,不过在这里就比较抽象一点,需要将具体的东西抽象成数值进行求函数。



最小二乘法(求得均方误差最小化模型)

求解上述函数中的w和b,使得∑mi=1(yi−wxi−b)2最小。

首先要理解什么是残差?

残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。“残差”蕴含了有关模型基本假设的重要信息。如果回归模型正确的话, 我们可以将残差看作误差的观测值。

接着再看一下置信区间

置信区间是指由样本统计量所构造的总体参数的估计区间。在统计学中,一个概率样本的置信区间(Confidence interval)是对这个样本的某个总体参数的区间估计。置信区间展现的是这个参数的真实值有一定概率落在测量结果的周围的程度。置信区间给出的是被测量参数的测量值的可信程度,即前面所要求的“一个概率”。

这个概率被称为置信水平。举例来说,如果在一次大选中某人的支持率为55%,而置信水平0.95以上的置信区间是(50%,60%),那么他的真实支持率有百分之九十五的机率落在百分之五十和百分之六十之间,因此他的真实支持率不足一半的可能性小于百分之2.5。 如例子中一样,置信水平一般用百分比表示,因此置信水平0.95上的置信空间也可以表达为:95%置信区间。置信区间的两端被称为置信极限。对一个给定情形的估计来说,置信水平越高,所对应的置信区间就会越大。

最后看一下回归系数

回归系数:在回归方程中表示自变量x 对因变量y 影响大小的参数。

回归系数越大表示x 对y 影响越大,正回归系数表示y 随x 增大而增大,负回归系数表示y 随x增大而减小。

回归方程式Y=bX+a中之斜率b,称为回归系数,表X每变动一单位,平均而言,Y将变动b单位。

[b]scatter(X,Y) 画散点图[/b]

X和Y是数据向量,以X中数据为横坐标,以Y中数据位纵坐标描绘散点图。

x = [16.0 31.7 -0.4 23.9 7.4 16.8 4.9 36.4 28.6 24.9];
y = [16.6 31.5 -3.2 30.0 7.6 10.1 1.3 37.6 23.0 33.4];
scatter(x, y, 'g*');


输入:



输出:



[b]polyval(p,x) n次多项式p在x处的值[/b]

x = -10:1:10;
p = [1, 1];
y = polyval(p, x);
scatter(x, y, 'r*');


输入:



输出:



曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值。

[b]polyfit(x,y,n) 最小二乘法曲线拟合[/b]

用多项式求过已知点的表达式,其中x为源数据点对应的横坐标,可为行向量、矩阵,y为源数据点对应的纵坐标,可为行向量、矩阵,n为你要拟合的阶数,一阶直线拟合,二阶抛物线拟合,并非阶次越高越好,看拟合情况而定。

x = [16.0 31.7 -0.4 23.9 7.4 16.8 4.9 36.4 28.6 24.9];
y = [16.6 31.5 -3.2 30.0 7.6 10.1 1.3 37.6 23.0 33.4];
scatter(x, y, 'g*');
p = polyfit(x, y, 1);
hold on;
X = -5:1:40;
Y = polyval(p,X);
plot(X, Y);


输入:



输出:



[b]corrcoef(x, y) 相关系数分析[/b]

R = corrcoef(X)

R = corrcoef(x,y)

[R,P]=corrcoef(…)

[R,P,RLO,RUP]=corrcoef(…)

R 是一个矩阵 表示相关系数

P 是一个矩阵 表示相关性,越小越相关性越显著

RLO RUP 是表示置信区间(要二个矩阵一起使用,RLO表示最小值, RUP表示最大值)

x = [16.0 31.7 -0.4 23.9 7.4 16.8 4.9 36.4 28.6 24.9];
y = [16.6 31.5 -3.2 30.0 7.6 10.1 1.3 37.6 23.0 33.4];
[R,P,RLO,RUP] = corrcoef(x, y)


输入:



输出:



[b]regress(Y, X) 一元及多元线性回归[/b]

b = regress(y, x)

[b,bint] = regress(y, x)

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

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

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

在这里,b 为回归系数, bint 为回归系数的区间估计, r为残差(误差), rint为置信区间(也就是误差区间),stats是用于检验回归模型的统计量,有四个数值:相关系数r^2,F值,与F对应的概率P,模型误差的方差,alpha是显著性水平(缺省的时候为0.05).相关系数r^2越大,说明回归方程越显著;与F对应的概率P

x = [16.0 31.7 -0.4 23.9 7.4 16.8 4.9 36.4 28.6 24.9];
y = [16.6 31.5 -3.2 30.0 7.6 10.1 1.3 37.6 23.0 33.4];
scatter(x, y, 'g*');
[b,bint,r,rint,stats] = regress(y', [ones(length(y) ,1), x']);
hold on;
X = -5:5:40;
Y = polyval(rot90(b,-1), X);
plot(X, Y);


输入:



输出:



上面的只是一元一次的,其实可以一元二次多次,比如下面这样

x = [16.0 31.7 -0.4 23.9 7.4 16.8 4.9 36.4 28.6 24.9];
y = [16.6 31.5 -3.2 30.0 7.6 10.1 1.3 37.6 23.0 33.4];
scatter(x, y, 'g*');
[b,bint,r,rint,stats] = regress(y', [ones(length(y) ,1), x', (x.^2)', (x.^3)']);
hold on;
X = -5:5:40;
Y = polyval(rot90(b,-1), X);
plot(X, Y);


输入:



输出:



其实很好理解,我们传入regress的第一个参数就是Y,也就是数据的输出值,那接下来就依次传入x0, x1, x2。。。即可,表示是一元多次。

那如果是二元多次的呢?也很简单,先学习一下所需知识和函数

[b]scatter3(x1, x2, y) 画三维的散点图[/b]

跟前面的scatter类似。

y=[7613.51  7850.91  8381.86  9142.81 10813.6 8631.43 8124.94 9429.79 10230.81 10163.61 9737.56 8561.06 7781.82 7110.97]';
x1=[7666 7704 8148 8571 8679 7704 6471 5870 5289 3815 3335 2927 2758 2591]';
x2=[16.22 16.85 17.93 17.28 17.23 17 19 18.22 16.3 13.37 11.62 10.36 9.83 9.25]';
scatter3(x1, x2, y, 'r*');


输入:



输出:



meshgrid

[b]peaks() Matlab为了测试立体绘图给出的一个快捷函数[/b]

z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) …

- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) …

- 1/3*exp(-(x+1).^2 - y.^2)

根据上面的式子得到Z值

peaks();


输入:



输出:



[b]mesh(X,Y,Z) 输出一个三维的网格[/b]

[X,Y] = meshgrid(-3:.125:3);
Z = peaks(X, Y);
mesh(X, Y, Z);


输入:



输出:



y=[7613.51  7850.91  8381.86  9142.81 10813.6 8631.43 8124.94 9429.79 10230.81 10163.61 9737.56 8561.06 7781.82 7110.97]';
x1=[7666 7704 8148 8571 8679 7704 6471 5870 5289 3815 3335 2927 2758 2591]';
x2=[16.22 16.85 17.93 17.28 17.23 17 19 18.22 16.3 13.37 11.62 10.36 9.83 9.25]';
scatter3(x1, x2, y, 'r*');
x=[ones(length(y), 1) x1.^2 x2.^2 x1 x2 x1.*x2];
[b,bint,r,rint,stats] = regress(y,x);
hold on;
X1 = min(x1):100:max(x1);
X2 = min(x2):1:max(x2);
[X1,X2] = meshgrid(X1,X2);
Y=b(1)+b(2)*X1.^2+b(3)*X2.^2+b(4)*X1 +b(5)*X2+b(6)*X1.*X2;
mesh(X1,X2,Y);


输入:



输出:



可以看出,resgress传入参数的时候,后面的输入值列表,其实可以是你设想的回归函数的表达式,传出来的b(回归系数),就是你表达式的系数。

正如书上所说



非线性优化

先来了解一下线性规划。

在MATLAB中,线性规划用linprog函数进行实现。

[b]linprog(f,A,b) 线性规划求最优解[/b]

[x,fval,exitflag,output,lambda] = linprog(f,A,b)

[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq)

[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,ub)

[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,ub,x0)

[x,fval,exitflag,output,lambda] = linprog(f,A,b,Aeq,beq,lb,ub,x0,options)

其中f,A,b,是不可缺省的输入变量,x是不可缺省的输出变量。f为函数表达式的系数,A是不等式左边的表达式的系数,B是A对应不等式右边的常数项(注意这里的等式是小于等于)。Aeq和beq是等式约束条件的参数(跟上述的A和B相似,只不过是等式)。它是问题的解.vlb,vub均是向量,分别表示x的下界和上界,x0为x的起始点,options为optimset函数中定义的参数的值,fval是目标函数在解x处的值,代表返回的最优解的情况。lambda为在解x处的lagrange乘子.lambda.lower对应于vlb,lambda.upper对应于ulb,lambda.ineqlin是对应于线性不等式约束的,lambda.eqlin是对应于线性等式约束的.

exitflag是规划返回的状态:

1、一阶最优性条件满足容许范围

2、X的变化小于容许范围

3、目标函数的变化小于容许范围

4、重要搜索方向小于规定的容许范围并且约束违背小于options.TolCon

5、重要方向导数小于规定的容许范围并且约束违背小于options.TolCon

0、到达最大迭代次数或到达函数评价

-1、算法由输出函数终止

-2、无可行点

output是执行的相关信息(迭代次数, 算法(相关算法介绍))



举个例子

比如求下面这个问题的最优解



f = [-40; -50];
A = [1 2; 3 2; 0 2];
b = [30; 60; 24];
x = linprog(f,A,b,[],[],[0; 0], []);
disp(x);
disp(x(1) * 40 + 50 * x(2));


输入:



输出:



接着做个小实验,看看能不能写出来一元二次的

max z = x + x2 (5x <= 20; x2 <= 4; x >= 0)

f = [-1, -1];
A = [5; 1];
b = [20; 2];
x = linprog(f,A,b,[],[],[0], []);


发现会报下面这个错误。提示说,A的数量必须与f的相同。



那我们将代码改成下面这样

f = [-1, -1];
A = [5 0; 0 1];
b = [20; 4];
Aeq = [1 -1];
beq = [0];
x = linprog(f,A,b,Aeq,beq ,[0; 0], []);


写到这里就会发现,无法表示x1和x2的关系是次方的关系,所以呢, linprog只能求多元一次的,那么怎么求多元二次呢?

[b]quadprog(H,f) 二次规划求最优解[/b]

[x,fval,exitflag,output,lambda] = quadprog(H,f)

[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b)

[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq)

[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub)

[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)

[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)

参数跟lineprog介绍一样。

具体用法看这里二次规划问题和MATLAB函数quadprog的使用

[b]optimset\optimget[/b]

最优化方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: