找到最适合数据的线
find the line which best fits to the data
我正在尝试找到最适合数据的行。我在下面使用以下代码,但现在 我想将数据放入一个排序的数组中,以便它具有最接近第一行的数据我该怎么做? 也是 polyfit为此使用的正确函数?
x=[1,2,2.5,4,5];
y=[1,-1,-.9,-2,1.5];
n=1;
p = polyfit(x,y,n)
f = polyval(p,x);
plot(x,y,'o',x,f,'-')
PS:我正在使用类似于 Matlab 的 Octave 4.0
你可以先计算真实值y
和预测值f
之间的误差
err = abs(y-f);
然后对误差向量进行排序
[val, idx] = sort(err);
并使用排序索引对您的 y 值进行排序
y2 = y(idx);
现在 y2
与 y
具有相同的值,但更接近拟合值的值优先。
对 x 执行相同的操作以计算 x2,以便在 x2 和 y2 之间建立对应关系
x2 = x(idx);
Sembei Norimaki 很好地解释了您的主要问题,所以我会看看您的次要问题 = polyfit 是正确的函数吗?
最佳拟合线定义为平均误差为零的线。
如果它必须是 "line",我们可以使用 polyfit,它将拟合多项式。当然,一个 "line" 可以定义为一次多项式,但是一次多项式有一些性质使其易于处理。您要查找的一阶多项式(或线性)方程应采用以下形式:
y = mx + b
其中 y 是您的因变量,X 是您的自变量。所以挑战是这样的:找到 m 和 b,使模型化的 y 尽可能接近实际 y。事实证明,与线性拟合相关的误差是凸的,这意味着它有一个最小值。为了计算这个最小值,最简单的组合偏差和 x 向量如下:
Xcombined = [x.' ones(length(x),1)];
然后利用从误差最小化导出的正规方程
beta = inv(Xcombined.'*Xcombined)*(Xcombined.')*(y.')
很好,现在我们的线被定义为 Y = Xcombined*beta。要画一条线,只需从 x 的某个范围内采样并添加 b 项
Xplot = [[0:.1:5].' ones(length([0:.1:5].'),1)];
Yplot = Xplot*beta;
plot(Xplot, Yplot);
那么为什么 polyfit 的效果这么差?好吧,我不能肯定地说,但我的假设是你需要转置你的 x 和 y 矩阵。我想这会给你一条更合理的路线。
x = x.';
y = y.';
然后尝试
p = polyfit(x,y,n)
希望对您有所帮助。一位智者曾经告诉我(我每天都在学习),不要相信你不理解的算法!
下面是一些测试代码,可以帮助其他人处理线性回归和最小二乘
%https://youtu.be/m8FDX1nALSE matlab代码
%https://youtu.be/1C3olrs1CUw不错的视频,如果你想测试的话可以手工制作
function [a0 a1] = rtlinreg(x,y)
x=x(:);
y=y(:);
n=length(x);
a1 = (n*sum(x.*y) - sum(x)*sum(y))/(n*sum(x.^2) - (sum(x))^2); %a1 this is the slope of linear model
a0 = mean(y) - a1*mean(x); %a0 is the y-intercept
end
x=[65,65,62,67,69,65,61,67]'
y=[105,125,110,120,140,135,95,130]'
[a0 a1] = rtlinreg(x,y); %a1 is the slope of linear model, a0 is the y-intercept
x_model =min(x):.001:max(x);
y_model = a0 + a1.*x_model; %y=-186.47 +4.70x
plot(x,y,'x',x_model,y_model)
我正在尝试找到最适合数据的行。我在下面使用以下代码,但现在 我想将数据放入一个排序的数组中,以便它具有最接近第一行的数据我该怎么做? 也是 polyfit为此使用的正确函数?
x=[1,2,2.5,4,5];
y=[1,-1,-.9,-2,1.5];
n=1;
p = polyfit(x,y,n)
f = polyval(p,x);
plot(x,y,'o',x,f,'-')
PS:我正在使用类似于 Matlab 的 Octave 4.0
你可以先计算真实值y
和预测值f
err = abs(y-f);
然后对误差向量进行排序
[val, idx] = sort(err);
并使用排序索引对您的 y 值进行排序
y2 = y(idx);
现在 y2
与 y
具有相同的值,但更接近拟合值的值优先。
对 x 执行相同的操作以计算 x2,以便在 x2 和 y2 之间建立对应关系
x2 = x(idx);
Sembei Norimaki 很好地解释了您的主要问题,所以我会看看您的次要问题 = polyfit 是正确的函数吗?
最佳拟合线定义为平均误差为零的线。
如果它必须是 "line",我们可以使用 polyfit,它将拟合多项式。当然,一个 "line" 可以定义为一次多项式,但是一次多项式有一些性质使其易于处理。您要查找的一阶多项式(或线性)方程应采用以下形式:
y = mx + b
其中 y 是您的因变量,X 是您的自变量。所以挑战是这样的:找到 m 和 b,使模型化的 y 尽可能接近实际 y。事实证明,与线性拟合相关的误差是凸的,这意味着它有一个最小值。为了计算这个最小值,最简单的组合偏差和 x 向量如下:
Xcombined = [x.' ones(length(x),1)];
然后利用从误差最小化导出的正规方程
beta = inv(Xcombined.'*Xcombined)*(Xcombined.')*(y.')
很好,现在我们的线被定义为 Y = Xcombined*beta。要画一条线,只需从 x 的某个范围内采样并添加 b 项
Xplot = [[0:.1:5].' ones(length([0:.1:5].'),1)];
Yplot = Xplot*beta;
plot(Xplot, Yplot);
那么为什么 polyfit 的效果这么差?好吧,我不能肯定地说,但我的假设是你需要转置你的 x 和 y 矩阵。我想这会给你一条更合理的路线。
x = x.';
y = y.';
然后尝试
p = polyfit(x,y,n)
希望对您有所帮助。一位智者曾经告诉我(我每天都在学习),不要相信你不理解的算法!
下面是一些测试代码,可以帮助其他人处理线性回归和最小二乘
%https://youtu.be/m8FDX1nALSE matlab代码
%https://youtu.be/1C3olrs1CUw不错的视频,如果你想测试的话可以手工制作
function [a0 a1] = rtlinreg(x,y)
x=x(:);
y=y(:);
n=length(x);
a1 = (n*sum(x.*y) - sum(x)*sum(y))/(n*sum(x.^2) - (sum(x))^2); %a1 this is the slope of linear model
a0 = mean(y) - a1*mean(x); %a0 is the y-intercept
end
x=[65,65,62,67,69,65,61,67]'
y=[105,125,110,120,140,135,95,130]'
[a0 a1] = rtlinreg(x,y); %a1 is the slope of linear model, a0 is the y-intercept
x_model =min(x):.001:max(x);
y_model = a0 + a1.*x_model; %y=-186.47 +4.70x
plot(x,y,'x',x_model,y_model)