2011-12-03 34 views
2

在matlab中,如何生成兩個隨機點集羣,如下圖所示。你能告訴我腳本/代碼嗎?如何在Matlab中生成這個形狀?

Target shape

+1

你想要生成點,還是要對它們進行聚類? – Oli

+0

k-means根據定義將無法對此進行聚類,因爲沒有voronoi分離。嘗試DBSCAN或OPTICS。 –

回答

5

如果你想產生這樣的數據點,你將需要讓他們的概率分佈能夠產生點。

爲了您的觀點,我沒有真正的分佈,所以我只能給出一個近似值。從你的圖中我可以看到,兩者都大致位於一個圓上,具有隨機半徑和角度的有限跨度。我假設這些角度和半徑均勻分佈在一定範圍內,這似乎是一個非常好的起點。

因此,在極座標(即角度和半徑)而不是笛卡爾座標(即水平和垂直)中生成隨機數據並轉換它們以允許繪圖也是有意義的。

C1 = [0 0]; % center of the circle 
C2 = [-5 7.5]; 
R1 = [8 10]; % range of radii 
R2 = [8 10]; 
A1 = [1 3]*pi/2; % [rad] range of allowed angles 
A2 = [-1 1]*pi/2; 

nPoints = 500; 

urand = @(nPoints,limits)(limits(1) + rand(nPoints,1)*diff(limits)); 
randomCircle = @(n,r,a)(pol2cart(urand(n,a),urand(n,r))); 

[P1x,P1y] = randomCircle(nPoints,R1,A1); 
P1x = P1x + C1(1); 
P1y = P1y + C1(2); 

[P2x,P2y] = randomCircle(nPoints,R2,A2); 
P2x = P2x + C2(1); 
P2y = P2y + C2(2); 

figure 
plot(P1x,P1y,'or'); hold on; 
plot(P2x,P2y,'sb'); hold on; 
axis square 

這產生了:

Outcome

這種方法與您可以輕鬆地變換,當你可以很容易地描述點的可能位置分佈相對而言尚能當您處理。如果不能,還有其他methods,如逆變換採樣方法,它提供算法來生成數據,而不是像我這樣做的手動變量轉換。

2

K-手段是不會給你想要的東西。

對於K均值,向量根據它們最近的聚類中心進行分類。我只能想到兩種方法可以得到圖中所示的非凸分配:

  • 您的輸入數據實際上是更高維的,而您的示例圖像只是一個2-d投影。
  • 您在整個維度中使用具有不同比例的距離度量。

爲了實現自己的目標:

  • 使用非線性聚類算法。
  • 對輸入數據應用非線性變換。 (可能不可行)。

您可以在非線性聚類算法here上找到列表。具體而言,請查看MST集羣頁面上的this reference。您的確切形狀出現在PDF的第四頁上,並與K-Means發生的情況進行比較。

對於現有的MATLAB代碼,您可以試試這個Kernel K-Means實現。另外,請查看Clustering Toolbox

+0

這是我從其他地方獲得的圖,所以我沒有原始的Matlab代碼來生成它。我知道K-means會失敗,所以我想嘗試單鏈接和完整鏈接,看看哪個更好。但在任何聚類之前,第一步就是生成這些數據。那麼如何在Matlab中做到這一點?所有的數據都是2D的。 –

2

假設您確實想對現有數據執行羣集操作,而不是生成數據本身。既然你有一些數據的陰謀,你已經知道如何做到這一點似乎是合乎邏輯的!如果我在這個假設中錯了,那麼你應該在未來更仔細地提出你的問題。

人類的大腦很擅長看到像這樣的事物,在計算機上編寫代碼通常需要一些認真的努力。如前所述,傳統的聚類工具如k-means會失敗。幸運的是,圖像處理工具箱爲已經寫好的這些用途提供了很好的工具。我可能會建議將圖轉換成圖像,使用填充點來繪製點。確保點的大小足以在羣集內互相接觸,並有一些重疊。然後根據需要使用擴張/腐蝕工具,以確保填充了任何小裂縫,但不要過於致使團簇合並。最後,使用區域分割工具挑選出簇。完成後,從圖像中的像素單位轉換回空間單位,並完成了您的任務。

對於圖像處理方法的工作,與集羣內的粗糙度相比,您需要足夠的集羣間隔。但是,對於任何成功的方法來說,這似乎都很明顯

+0

這是我從其他地方獲得的圖形,所以我沒有原始的Matlab代碼來生成它。我知道K-means會失敗,所以我想嘗試單鏈接和完整鏈接,看看哪個更好。但在任何聚類之前,第一步就是生成這些數據。那麼如何在Matlab中做到這一點?謝謝。 –