bla*_*bla 5 matlab curve-fitting noise data-fitting ransac
我有一个嘈杂的信号和一个模型函数,例如:
x=linspace(0,20);
w=[2 6 -4 5];
y=w(1)*besselj(0,x)+w(2)*besselj(1,x)+w(3)*besselj(2,x)+w(4)*besselj(3,x);
y(randi(length(y),[1 10]))=10*rand(1,10)-5;
plot(x,y,'x')
Run Code Online (Sandbox Code Playgroud)
我想使用 RANSACw在我的模型中找到,因为这种方法在查找线时对噪声具有鲁棒性。然而,这不是一个线性问题,我无法得到合适的拟合,可能是因为我试图拟合的函数的振荡性质。
我看到 matlab 有一个 fitPolynomialRansac 函数,但即使对于一个a+b*x+c*x^2+d*x^3简单的情况(-1 和 1 之间),这也失败了。
任何想法如何驯服RANSAC?或不同的鲁棒噪声方法?
这只是实现 @mikuszefski 的评论以使用软 L1 损失函数。它似乎确实更能抵抗噪音:
x = linspace(0,20);
% model function
yFun=@(w) w(1)*besselj(0,x)+w(2)*besselj(1,x)+w(3)*besselj(2,x)+w(4)*besselj(3,x);
% generate training data
N = 20; % number of noisy elements
w=[2 6 -4 5]; % true paramater values
y = yFun(w); % evaluate true model function
y(randi(length(y),[1 N])) = 10*rand(1,N)-5; % add noise
% standard loss function for least sqaure
d = @(w) yFun(w)-y;
v1 = lsqnonlin(d,[1 1 1 1]); % normal least squares
v2 = lsqnonlin(@(w) sqrt(2*(sqrt(1+d(w).^2)-1)),[1 1 1 1]) % soft L1 loss
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
207 次 |
| 最近记录: |