基本形式
例如绪论中的判断好瓜的算法,就可以用一个线性的模型来表示,好瓜 = 色泽 * 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单位。
scatter(X,Y) 画散点图
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*');
- 输入:
- 输出:
polyval(p,x) n次多项式p在x处的值
x = -10:1:10;
p = [1, 1];
y = polyval(p, x);
scatter(x, y, 'r*');
- 输入:
- 输出:
曲线拟合:已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值。
polyfit(x,y,n) 最小二乘法曲线拟合
用多项式求过已知点的表达式,其中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);
- 输入:
- 输出:
corrcoef(x, y) 相关系数分析
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)
- 输入:
- 输出:
regress(Y, X) 一元及多元线性回归
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 。。。即可,表示是一元多次。
那如果是二元多次的呢?也很简单,先学习一下所需知识和函数
scatter3(x1, x2, y) 画三维的散点图
跟前面的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*');
- 输入:
- 输出:
peaks() Matlab为了测试立体绘图给出的一个快捷函数
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();
- 输入:
- 输出:
mesh(X,Y,Z) 输出一个三维的网格
[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(回归系数),就是你表达式的系数。
正如书上所说