2012-02-03 18 views
6

Ho due vettori che sono accoppiati valoritrama contorno colorato dal raggruppamento di punti MATLAB

size(X)=1e4 x 1; size(Y)=1e4 x 1 

E 'possibile tracciare una contour plot di qualche tipo rendendo i contorni dalla più alta densità di punti? Cioè il clustering più alto = rosso, e quindi il colore sfumato altrove?

Se avete bisogno di ulteriori chiarimenti si prega di chiedere. Saluti,

ESEMPIO DI DATI:

X=[53 58 62 56 72 63 65 57 52 56 52 70 54 54 59 58 71 66 55 56]; 
Y=[40 33 35 37 33 36 32 36 35 33 41 35 37 31 40 41 34 33 34 37 ]; 
scatter(X,Y,'ro'); 

enter image description here

Grazie per l'aiuto di tutti. Ha anche ricordato che possiamo usare hist3:

x={0:0.38/4:0.38}; % # How many bins in x direction 
y={0:0.65/7:0.65}; % # How many bins in y direction 

ncount=hist3([X Y],'Edges',[x y]); 
pcolor(ncount./sum(sum(ncount))); 
colorbar 

Qualcuno sa perché edges in hist3 devono essere le cellule?

+2

ho bisogno di maggiori chiarimenti. Se potessi disegnare alcune immagini e pubblicare alcuni dati di esempio (o un modo per crearlo), sarebbe fantastico. –

+0

@Andrey Ecco un diagramma di dispersione campione. Quello che sto cercando è un contorno di clustering ad alta o bassa densità. Credo che sia anche possibile trovare il centroide di questi dati. Cosa ne pensi? – HCAI

risposta

9

Questa è fondamentalmente una domanda sulla stima della funzione di densità di probabilità che genera i dati e quindi visualizzarli in un modo buono e significativo direi. A tal fine, consiglierei di utilizzare una stima più uniforme dell'istogramma, ad esempio le finestre Parzen (una generalizzazione del metodo dell'istogramma).

Nel mio codice di seguito, ho utilizzato il set di dati di esempio e stimato la densità di probabilità in una griglia impostata dall'intervallo di dati. Qui hai 3 variabili che devi modificare per utilizzare i tuoi dati originali; Borders, Sigma e stepSize.

Border = 5; 
Sigma = 5; 
stepSize = 1; 

X=[53 58 62 56 72 63 65 57 52 56 52 70 54 54 59 58 71 66 55 56]; 
Y=[40 33 35 37 33 36 32 36 35 33 41 35 37 31 40 41 34 33 34 37 ]; 
D = [X' Y']; 
N = length(X); 


Xrange = [min(X)-Border max(X)+Border]; 
Yrange = [min(Y)-Border max(Y)+Border]; 


%Setup coordinate grid 
[XX YY] = meshgrid(Xrange(1):stepSize:Xrange(2), Yrange(1):stepSize:Yrange(2)); 
YY = flipud(YY); 

%Parzen parameters and function handle 
pf1 = @(C1,C2) (1/N)*(1/((2*pi)*Sigma^2)).*... 
     exp(-((C1(1)-C2(1))^2+ (C1(2)-C2(2))^2)/(2*Sigma^2)); 

PPDF1 = zeros(size(XX));  

%Populate coordinate surface 
[R C] = size(PPDF1); 
NN = length(D); 
for c=1:C 
    for r=1:R 
     for d=1:N 
      PPDF1(r,c) = PPDF1(r,c) + ... 
       pf1([XX(1,c) YY(r,1)],[D(d,1) D(d,2)]); 
     end 
    end 
end 


%Normalize data 
m1 = max(PPDF1(:)); 
PPDF1 = PPDF1/m1; 

%Set up visualization 
set(0,'defaulttextinterpreter','latex','DefaultAxesFontSize',20) 
fig = figure(1);clf 
stem3(D(:,1),D(:,2),zeros(N,1),'b.'); 
hold on; 

%Add PDF estimates to figure 
s1 = surfc(XX,YY,PPDF1);shading interp;alpha(s1,'color'); 
sub1=gca; 
view(2) 
axis([Xrange(1) Xrange(2) Yrange(1) Yrange(2)]) 

enter image description here

Nota, questa visualizzazione è in realtà 3-dimensionale:

enter image description here

+0

Grazie. Questo è proprio quello che stavo cercando, soprattutto perché i miei dati hanno solo un limite globale. Ho bisogno di guardarlo in dettaglio. Tuttavia, mi viene in mente che, nei casi in cui i dati sono sparsi o contenenti più "picchi", quanto bene si tratta di questi fenomeni? – HCAI

+0

Non sono abbastanza sicuro di cosa intendi.Questo metodo dipende in larga misura da quale Sigma hai scelto di utilizzare per i tuoi dati. Se è correttamente selezionato (non troppo alto e non troppo piccolo), il metodo dovrebbe restituire una stima utilizzabile. Se Sigma è troppo piccolo, vedrai piccoli dossi attorno a tutti i tuoi punti di riferimento; se è troppo grande, la stima diventerà troppo grossolana e non estrarrà tutte le informazioni. Tieni presente che tutti questi metodi di stima richiedono una buona quantità di dati per funzionare correttamente e la stima è valida solo nelle regioni popolate da punti dati. – Vidar

+0

Esiste un metodo rigoroso per scegliere il tuo valore sigma (basato sulla variazione dei dati, forse?)? Cosa succede però quando i dati sono chiaramente bimodali. Può catturare la depressione tra le vette? Ci proverò e vedrò cosa succede. – HCAI

1

Vorrei dividere l'area del grafico in una griglia e contare il numero di punti in ogni quadrato della griglia. Ecco un esempio di come potrebbe essere fatto.

% Get random data with high density 
X=randn(1e4,1); 
Y=randn(1e4,1); 

Xmin=min(X); 
Xmax=max(X); 
Ymin=min(Y); 
Ymax=max(Y); 
% guess of grid size, could be divided into nx and ny 
n=floor((length(X))^0.25); 

% Create x and y-axis 
x=linspace(Xmin,Xmax,n); 
y=linspace(Ymin,Ymax,n); 
dx=x(2)-x(1); 
dy=y(2)-y(1); 
griddata=zeros(n); 
for i=1:length(X) 
    % Calculate which bin the point is positioned in 
    indexX=floor((X(i)-Xmin)/dx)+1; 
    indexY=floor((Y(i)-Ymin)/dy)+1; 
    griddata(indexX,indexY)=griddata(indexX,indexY)+1; 
end 
contourf(x,y,griddata) 

Modifica: il video nella risposta dal Marm0t utilizza la stessa tecnica ma probabilmente lo spiega in un modo migliore.

Problemi correlati