2014-02-10 4 views
2

Matlab의 x, y 점 집합으로 회귀선을 플로팅 할 수 있습니다. 그러나 점의 클러스터 (아래 그림과 같이)가 있다면 4 개의 점 클러스터가 있다고 가정하고 4 개의 회귀선을 그려야합니다. 어떻게하면됩니까? 모든 점은 x, y에 저장됩니다. 그것들을 분리하여 4 가지 다른 변수 집합으로 묶을 방법이 없습니다.Matlab의 점 집합 클러스터 회귀선

아래 이미지를 참조하십시오. 범례와 라벨을 무시하십시오. 어떻게 Matlab에서이 작업을 수행 할 수 있습니까? 하나의 클러스터 만 있다면 할 수 있습니다. 그러나 나는 한 번에 네 개의 클러스터 모두를 위해하고 싶다. 나는 하나 개의 클러스터 지금 사용하고 enter image description here

코드 : 당신은 클러스터로 값을 구분해야합니다

%----------- 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'); 
+1

하나의 세트에 대해 작동하는 코드를 게시 할 수 있습니까? f 점? – darthbith

+0

게시물에 추가되었습니다. 확인해주십시오. – ridctg

+0

'polyfit (x (1:10), y (1:10), 1)'과 같은 행렬 색인을 사용할 수 있습니까? 왜 그들을 분리 된 변수로 나눌 수 없습니까? – darthbith

답변

3

. 이것은 사소한 작업입니다. 이것은 예를 들어, 통계 도구 상자에서 kmeans를 통해 수행 할 수 있습니다

%// 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') 

결과 :

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 

enter image description here

계정에 다른 순서 (플롯의 색상을보고)를 촬영을 , 이러한 결과는 참으로 당신이 기대하는 것입니다. 나는 다음과 같은 큰 잡음을 들었습니다.

+0

안녕하세요, 제공해 주신 솔루션에 감사드립니다. 문제가 있습니다. 나는 몇 가지 포인트가 수직으로 퍼져있다. 그래서 회귀 직선이 특정 경우에 대해 수직 방향이되도록하고 싶습니다. 가능한가? 그리고 또한, 나는 마커 (점)가 투명 해지기를 바란다. 나는 그것을 할 수있는 방법을 찾지 못했다. ... 도울 수 있는지 알려줘. – ridctg

관련 문제