MATLAB中数值拟合的种种办法

首先是大名鼎鼎的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.










评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值