首先是大名鼎鼎的regress
regress(Y,X,alpha)
其中alpha可省略,省略时为0.05.
简单来说,这里的y指的就是对应的函数值,注意是列向量(如果是行向量要转置),x是自变量的取值(每一列为一组),注意因为考虑常数项,所以要在原x前加上一列全为1
举个简单的例子:
m=[234 237 239 280 290]
x=[3.13 3.15 3.18 3.19 3.23]
y=[87.5 89.6 94.5 99.5 104.6]
做m=ax+by+c的二元拟合.
>> m=[234 237 239 280 290];
>> x=[3.13 3.15 3.18 3.19 3.23];
>> y=[87.5 89.6 94.5 99.5 104.6];
>> t=[ones(size(x,2),1),x',y'];%这里的size(x,2)代表求x向量的列数,注意一定要在前面加上一列全为1,t=[x1,x2,x3]若x1,x2,x3行数相等则表示着将这几行横着拼起来
>> b=regress(m',t)%原来m是行向量,转化为列向量
可以得到一个向量存储c,a,b,最后把它打印出来。
>> [x,y]=meshgrid([-10:0.1:10]);
>> z=b(1)+x.*b(2)+y.*b(3);
>> surf(x,y,z);
接下来就可以用regress做一些logistic回归,比如预测未来...
开发时间 单位规模 市场份额 市场反响 预测值
-68.8000 -89.5000 1.7000 0 0
3.3000 -3.5000 1.1000 0 0
-120.8000 -103.2000 2.5000 0 0
-18.1000 -28.8000 1.1000 0 0
43 16.4000 1.3000 1 1
47 16 1.9000 1 1
-3.3000 4 2.7000 1 1
35 20.8000 1.9000 1 1
这是从logistic.xlsx中拉出来的数据,一共8组数据,现在我们取前面6组数据进行拟合,用最后两组数据检验。
x0=xlsread('logistic.xlsx','A2:C7');%读入有答案的个个参数的值
xe=xlsread('logistic.xlsx','A2:C9');%读入所有参数的值
y0=xlsread('logistic.xlsx','D2:D7');%读入目前的答案
n=size(y0,1);%获取yo的行
for i=1:n
if (y0(i)==0)%如果y0的结果是0
y1(i,1)=0.25;取0~0.5的中值作为区间值
else
y1(i,1)=0.75;
end
end
x1=ones(size(x0,1),1);%构建常数项,一列为1
x=[x1,x0];
y=log(y1./(1-y1));
b=regress(y,x);
for i=2:size(xe,1)
pai=exp(b(1)+b(2)*xe(i,1)+b(3)*xe(i,2)+b(4)*xe(i,3))/(1+exp(b(1)+b(2)*xe(i,1)+b(3)*xe(i,2)+b(4)*xe(i,3)));
if (pai<=0.5)
p(i)=0;
else
p(i)=1;
end
end
disp(['回归系数:',num2str(b')]);
disp(['评价结果:',num2str(p)]);
回归系数:-2.4551 0.029124 -0.01144 1.4231
评价结果:0 0 0 0 1 1 1 1(后面两种是推断出来的)
可见效果还是不错的。
事实上只需给出一些可能与最终结果相关的因变量和它的结果,都可以推测出更广泛的情况。
最后区分几点:
regress是用的最小二乘算法。狭义上的最小二乘算法适用于线性回归,,最终结果为全局最优。而广义上的最小二乘法则适用于曲线,
但是我们有更优秀的梯度下降,是假设条件更为广泛(无约束)的,一种通过迭代更新来逐步进行的参数优化方法,最终结果为局部最优。
相比较于之前的fittype和polyfit:
1,已知函数的形式,要求函数系数,直接fittype走起.
2,线性多元,常用regress.
3,如果非线性(最好还是一元),常用polyfit.