Puedo trazar una línea de regresión con un conjunto de x, yPuntos en Matlab. Pero, si tengo un grupo de puntos (como la imagen de abajo), digamos que tengo cuatro grupos de puntos y quiero dibujar cuatro líneas de regresión para ellos ... ¿cómo lo haría? Todos los puntos se guardan en x, y. No hay manera de separarlos y colocarlos en cuatro conjuntos diferentes de variables.
Vea la imagen de abajo. Ignora las leyendas y las etiquetas. ¿Alguna idea de cómo puedo hacer esto en Matlab? Si solo hay un grupo, puedo hacerlo. Pero quiero hacerlo para los cuatro grupos a la vez.
Código que estoy usando ahora para un grupo:
%----------- Linear regression -----------------
p= polyfit(x,y,1);
f= polyval(p,x);
%----------- Call R-square function ------------
r2=Rsquare(x,y,p);
%------------- Plot data -----------------------
figure()
plot(x,y,"*k");hold on
plot(x,f,"-r"); % show linear fit
xlabel("index");
ylabel("Intensity a.u.");
title("Test: Linear regreesion && R-square");
%------- Show y-data on current figure ---------
[row col]=size(y);
for i=1:col
str=num2str(y(i));
text(x(i),y(i),str,"Color",[0 0 1]);
end
%--Show linear equation on current figure -------
m1=num2str(p(1));c1=num2str(p(2));Rsquare1=num2str(r2(1));
text(1.05,80,["y= ",m1,"x+",c1," , R^2= ",Rsquare1,"."],"FontSize",10,"FontName","Times New Roman");
Respuestas
3 para la respuesta № 1Tendrá que separar sus valores en grupos. Esta es una operación no trivial. Esto se puede hacer a través de kmeans
en la caja de herramientas de estadísticas, por ejemplo:
%// First, I generate some example data in 4 clusters.
%// intercepts
a = [4 7 0 -5];
%// slopes
b = [0.7 1.0 1.0 0.8];
%// ranges
xmin = [+1 -6 -6 +1];
xmax = [+6 -1 -1 +6];
%// generate clusters
N = [30 40 25 33];
X = arrayfun(@(ii) (xmax(ii)-xmin(ii))*rand(N(ii),1) + xmin(ii), 1:4, "UniformOutput", false);
Y = arrayfun(@(ii) a(ii) + b(ii)*X{ii} + randn(size(X{ii})), 1:4, "UniformOutput", false);
%// Unfortunately, your points not are given in 4 separate clusters, but
%// in a single array:
X = cat(1,X{:});
Y = cat(1,Y{:});
%// Therefore, you"ll have to separate the data again into clusters:
idx = kmeans([X,Y], 4, "Replicates", 2);
X = {
X(idx==1)
X(idx==2)
X(idx==3)
X(idx==4)
};
Y = {
Y(idx==1)
Y(idx==2)
Y(idx==3)
Y(idx==4)
};
%// Now perform regression on each cluster
ab = arrayfun(@(ii) [ones(size(X{ii})) X{ii}]Y{ii}, 1:4, "UniformOutput", false);
%// the original values, and the computed ones
%// note that the order is not the same!
[a; b]
[ab{:}]
%// Plot everything for good measure
figure(1), clf, hold on
plot(...
X{1}, Y{1}, "g.",...
X{2}, Y{2}, "b.",...
X{3}, Y{3}, "r.",...
X{4}, Y{4}, "c.")
line([min(X{1}); max(X{1})], ab{1}(1) + ab{1}(2)*[min(X{1}); max(X{1})], "color", "k")
line([min(X{2}); max(X{2})], ab{2}(1) + ab{2}(2)*[min(X{2}); max(X{2})], "color", "k")
line([min(X{3}); max(X{3})], ab{3}(1) + ab{3}(2)*[min(X{3}); max(X{3})], "color", "k")
line([min(X{4}); max(X{4})], ab{4}(1) + ab{4}(2)*[min(X{4}); max(X{4})], "color", "k")
Resultados:
ans =
4.0000 7.0000 0 -5.0000
0.7000 1.0000 1.0000 0.8000
ans =
-4.6503 6.4531 4.5433 -0.6326
0.7561 0.8916 0.5914 0.7712
Teniendo en cuenta el orden diferente (mirando los colores de la trama), estos resultados son de hecho lo que esperaría, dado el gran grado de ruido que pongo :)