Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB中FOR循环的回归_Matlab_For Loop_Regression - Fatal编程技术网

MATLAB中FOR循环的回归

MATLAB中FOR循环的回归,matlab,for-loop,regression,Matlab,For Loop,Regression,我有以下代码: colBIN = {0.050, 0.055, 0.060, 0.065, 0.070, 0.075, 0.080, 0.085, 0.090, 0.095,0.1}; for i = 1 : length(colBIN)-1 colBIN{i,2} = find(cols(:,1) <= cell2mat(colBIN(i+1,1)) & cols(:,1) > cell2mat(colBIN(i,1))); end rowBIN = {0.04

我有以下代码:

colBIN = {0.050, 0.055, 0.060, 0.065, 0.070, 0.075, 0.080, 0.085, 0.090, 0.095,0.1};

for i = 1 : length(colBIN)-1
    colBIN{i,2} = find(cols(:,1) <= cell2mat(colBIN(i+1,1)) & cols(:,1) > cell2mat(colBIN(i,1)));
end

rowBIN = {0.045, 0.046, 0.047, 0.048, 0.049, 0.050, 0.051, 0.052};

for i = 1 : length(rowBIN)-1
    rowBIN{i,2} = find(rows(:,1) <= cell2mat(rowBIN(i+1,1)) & rows(:,1) > cell2mat(rowBIN(i,1))); 
end

binCombos = cell(length(rowBIN)-1,length(colBIN)-1);

for m = 1 : length(rowBIN)-1
    for n = 1 : length(colBIN)-1
        binCombos{n,m} = intersect( rowBIN{m,2}(:,1),colBIN{n,2}(:,1));
    end
end


binRows = size(binCombos,1);
binCols = size(binCombos,2)-1;

j = j + 1;
for n = 1 : binRows; 
    for m = 1 : binCols;
       thisBin = binCombos{n,m}(:,:); 
       if isempty(thisBin)==0

       %polyfit
       quadmod = polyfit(x_vrbl(thisBin), y_vrbl(thisBin), 2);
       interval = 0.0:0.001:1;
       quadmodcurve = polyval(quadmod,interval); 
       [r2 rmse] = rsquare(y_vrbl(thisBin), quadmodcurve); 
       plot(x_vrbl(thisBin), y_vrbl(thisBin), '*', interval, quadmodcurve);
       xlabel('x_vrbl');
       ylabel('y_vrbl');
       axis([0,1,0,1]);
       header = ['R^2 =' num2str(r2),'coeffs:',num2str(quadmod)];
       title(header);
       saveas(gcf, sprintf('plot_%d.pdf', j));

       %residuals
       res = y_vrbl(thisBin) - quadmodcurve;
       plot(x_vrbl(thisBin),res,'+');
       header2 = ['residuals'];
       title(header2);
       saveas(gcf, sprintf('residuals_%d.pdf', j));

       end
       j = j + 1;
   end
end
colBIN={0.050,0.055,0.060,0.065,0.070,0.075,0.080,0.085,0.090,0.095,0.1};
对于i=1:长度(colBIN)-1
colBIN{i,2}=find(cols(:,1)cell2mat(colBIN(i,1));
终止
rowBIN={0.045,0.046,0.047,0.048,0.049,0.050,0.051,0.052};
对于i=1:长度(rowBIN)-1
rowBIN{i,2}=find(rows(:,1)cell2mat(rowBIN(i,1));
终止
binCombos=单元格(长度(rowBIN)-1,长度(colBIN)-1);
对于m=1:长度(rowBIN)-1
对于n=1:长度(colBIN)-1
binCombos{n,m}=intersect(rowBIN{m,2}(:,1),colBIN{n,2}(:,1));
终止
终止
binRows=大小(binCombos,1);
binCols=大小(binCombos,2)-1;
j=j+1;
对于n=1:binRows;
对于m=1:binCols;
thisBin=binCombos{n,m}(:,:);
如果isempty(thisBin)==0
%多面体
quadmod=polyfit(x_vrbl(thisBin),y_vrbl(thisBin),2);
间隔=0.0:0.001:1;
quadmodcurve=polyval(quadmod,区间);
[r2 rmse]=rsquare(y_vrbl(thisBin),quadmodcurve);
绘图(x_vrbl(thisBin),y_vrbl(thisBin),“*”,区间,四元曲线);
xlabel('x_vrbl');
ylabel('y_vrbl');
轴([0,1,0,1]);
header=['R^2='num2str(r2),'coeffs:',num2str(quadmod)];
标题(标题);
saveas(gcf,sprintf('plot_%d.pdf',j));
%残差
res=y_vrbl(thisBin)-四元曲线;
图(x_vrbl(thisBin),res,“+”);
校长2=[‘残差’];
职称(校长2);
saveas(gcf,sprintf('residuals_u%d.pdf',j));
终止
j=j+1;
终止
终止
解释/问题:

binCombos
是一个二维单元数组,每个单元的数据点数量不一致。我正在将二次曲线拟合到每个唯一单元格的数据,并尝试(未成功)输出R^2值,以及绘制残差


我认为问题与以下事实有关:
polyval
函数所需的“间隔”与
y\u vrbl(thisBin)
在尝试查找rsquare时的数组大小不匹配,同样,在计算残差时也不匹配。例如,如果我设置了
interval=x_vrbl(thisBin)
,则残差“起作用”,但多边形拟合完全混乱。

我猜这应该起作用:

quadmodcurve = polyval(quadmod,y_vrbl(thisBin)); 
[r2 rmse] = rsquare(y_vrbl(thisBin), quadmodcurve);
interval = 0.0:0.001:1;
quadmodcurve = polyval(quadmod,interval); 

为了确定拟合质量,必须仅在样本的x值处计算多项式。为了绘制完整的多项式图,您需要以更大且间隔更规则的x值对其进行求值。

我设法使您的代码在运行时使用 更正一些错误后:

d = importdata('sample_data.xlsx');
y_vrbl = d.data(:, 1);
x_vrbl = d.data(:, 2);
rows = d.data(:, 3);
cols = d.data(:, 4);

cb = {0.050, 0.055, 0.060, 0.065, 0.070, 0.075, 0.080, 0.085, 0.090, 0.095,0.1};

for i = 1 : length(cb)-1
    colBIN{i,2} = find(cols(:,1) <= cell2mat(cb(i+1)) & cols(:,1) > cell2mat(cb(i)));
end

rb = {0.045, 0.046, 0.047, 0.048, 0.049, 0.050, 0.051, 0.052};

for i = 1 : length(rb)-1
    rowBIN{i,2} = find(rows(:,1) <= cell2mat(rb(i+1)) & rows(:,1) > cell2mat(rb(i)));
end

binCombos = cell(length(rowBIN)-1,length(colBIN)-1);

for m = 1 : length(rowBIN)-1
    for n = 1 : length(colBIN)-1
        binCombos{n,m} = intersect( rowBIN{m,2}(:,1),colBIN{n,2}(:,1));
    end
end


binRows = size(binCombos,1);
binCols = size(binCombos,2)-1;

j = 1;
for n = 1 : binRows;
    for m = 1 : binCols;
        thisBin = binCombos{n,m}(:,:);
        if ~isempty(thisBin)

            % polyfit
            quadmod = polyfit(x_vrbl(thisBin), y_vrbl(thisBin), 2);

            % compute residuals and R²
            quadmodcurve = polyval(quadmod,y_vrbl(thisBin));
            [r2, rmse] = rsquare(y_vrbl(thisBin), quadmodcurve);
            res = y_vrbl(thisBin) - quadmodcurve;

            % plot fit
            interval = 0.0:0.001:1;
            quadmodcurve = polyval(quadmod,interval);
            plot(x_vrbl(thisBin), y_vrbl(thisBin), '*', interval, quadmodcurve);
            xlabel('x_vrbl');
            ylabel('y_vrbl');
            axis([0,1,0,1]);
            header = ['R^2 =' num2str(r2),'coeffs:',num2str(quadmod)];
            title(header);
            saveas(gcf, sprintf('plot_%d.pdf', j));

            % plot residuals
            plot(x_vrbl(thisBin),res,'+');
            header2 = ['residuals'];
            title(header2);
            saveas(gcf, sprintf('residuals_%d.pdf', j));

        end
        j = j + 1;
    end
end
似乎更合适,在大多数情况下,R²大于0.9


我的建议是:检查R²在您的案例中是否是适合度的正确度量,并检查该函数是否正确地实现了它。Matlab附带的函数是可以信任的,但是Matlab文件交换上的帖子没有质量保证。

据我所知,如果不能运行此代码,它应该是正确的,就像您最初使用的方式一样。到底是什么问题?您是否收到错误消息?再次查看:rsquare做什么?您可以发布您的实现吗?这是我用于r^2的例程:良好的开始,这解决了正确输出曲线和数据的问题。然而,我得到的R^2的大部分是零,即使有大量的数据和好看的拟合…?你能发布一个样本数据集吗?忘了提及;“行”和“列”存储箱可以按升序/降序等距排列。感谢您仔细查看!我不知道如何建造垃圾箱。也许你可以发布其中一个箱子的x_vrbl(thisBin)和y_vrbl(thisBin)的值?只是在我的原始帖子中添加了构建箱子的代码,让我知道这是否有效,或者实际上有点可疑:那
max
根本没有任何意义。根据下面的评论,我认为rsquare函数可以工作,我只是在polyval中使用了错误的变量。无论如何,我真的很感谢你对这个问题的分析。谢谢你!
[r2, rmse] = rsquare(y_vrbl(thisBin), quadmodcurve, false);