Perpendicular desplazamiento de mínimos cuadrados de montaje tiene un montón de ventajas en comparación con los nativos de mínimos cuadrados esquema de montaje. La siguiente figura ilustra la diferencia entre hay, y para una comparación más detallada de estos dos métodos, la que nos referimos aquí.
Perpendicular desplazamiento de mínimos cuadrados el ajuste, sin embargo, no es inmune a los valores atípicos( puntos que no deben ser utilizados para el modelo de estimación). Por lo tanto, ahora estoy considerando la posibilidad de utilizar un promedio ponderado de desplazamiento perpendicular de mínimos cuadrados el método de regresión. El método consta de dos pasos:
- Calcular el factor de ponderación para cada uno de los puntos que van a ser utilizados para la línea de estimación;
- Realizar perpendicular de desplazamiento en un promedio ponderado mínimo de cuadrados de regresión esquema.
Por el momento, mi mayor problema viene desde el paso 2. Supongamos que los factores de ponderación se han dado, ¿cómo puedo obtener la fórmula para la estimación de los parámetros de la línea? Muchas gracias!
EDITAR:
Basado en el tipo de sugerencia de @MvG he implementado el algoritmo en MATLAB:
function line = estimate_line_ver_weighted(pt_x, pt_y,w);
% pt_x x coordinate
% pt_y y coordinate
% w weighting factor
pt_x = pt_x(:);
pt_y = pt_y(:);
w = w(:);
% step 1: calculate n
n = sum(w(:));
% step 2: calculate weighted coordinates
y_square = pt_y(:).*pt_y(:);
x_square = pt_x(:).*pt_x(:);
x_square_weighted = x_square.*w;
y_square_weighted = y_square.*w;
x_weighted = pt_x.*w;
y_weighted = pt_y.*w;
% step 3: calculate the formula
B_upleft = sum(y_square_weighted)-sum(y_weighted).^2/n;
B_upright = sum(x_square_weighted)-sum(x_weighted).^2/n;
B_down = sum(x_weighted(:))*sum(y_weighted(:))/n-sum(x_weighted.*pt_y);
B = 0.5*(B_upleft-B_upright)/B_down;
% step 4: calculate b
if B<0
b = -B+sqrt(B.^2+1);
else
b = -B-sqrt(B.^2+1);
end
% Step 5: calculate a
a = (sum(y_weighted)-b*sum(x_weighted))/n;
% Step 6: the model is y = a + bx, and now we transform the model to
% a*x + b*y + c = 0;
c_ = a;
a_ = b;
b_ = -1;
line = [a_ b_ c_];
El resultado es tan bueno como se puede esperar, lo cual se ilustra en la siguiente secuencia de comandos:
%% Procedure 1: given the data
pt_x = [ 692 692 693 692 693 693 750];
pt_y = [ 919 971 1022 1074 1126 1230 1289];
% Procedure 2: draw the point
close all; figure; plot(pt_x,pt_y,'b*');
% Procedure 3: estimate the line based on the weighted vertical offset
% least square method.
weighting = ones(length(pt_x),1);
weighting(end) = 0.01; % we give the last point a low weighting because obvously it is an outlier
myline = estimate_line_ver_weighted(pt_x,pt_y,weighting);
a = myline(1); b = myline(2); c= myline(3);
% Procedure 4: draw the line
x_range = [min(pt_x):0.1:max(pt_x)];
y_range = [min(pt_y):0.1:max(pt_y)];
if length(x_range)>length(y_range)
x_range_corrspond = -(a*x_range+c)/b;
hold on; plot(x_range,x_range_corrspond,'r');
else
y_range_correspond = -(b*y_range+c)/a;
hold on; plot(y_range_correspond,y_range,'r');
end
La siguiente figura corresponde a la secuencia de comandos anterior: .