我正在使用k-means聚類算法,并且對于每個聚類質心,我試圖為質心生成n維Voronoi區域 . 之后我需要從Voronoi區域生成隨機點 .
我已經嘗試使用Matlab / Octave和scipy來獲得n維Voronoi區域 . 但我有兩個問題 .
生成頂點和區域后,如何從區域生成隨機數據
如果聚類質心的數量小于n,則可以構造Voronoi區域,維數
編輯 -
我的主要目標是生成一個碼本 . 我有60k的n維數據點,我想創建一個比如512個碼字的碼本,其中每個碼字都是n維的 . 碼本是原始數據的近似值 . 聚類將是這樣做的一種方式 . 由于k-means需要很長時間,我想使用自適應迭代LBG(Shen Furao和Osamu Hasegawa),其過程是 -
找到具有最大錯誤的集群質心 - 讓我們稱之為C_large
在C_large的Voronoi區域生成一個隨機點,讓我們稱之為C_new
使用voronoi區域中的數據點運行k-means,只有兩個質心,C_large和C_new
這將比k-means快得多,因為每次使用總數據點的子集和僅兩個質心運行k-means .
但是,算法以k = 1開始 . 但是直到k> n(數據是n維的)我才能使用scipy或Octave找到Voronoi區域 .
因此,如果我有一個單個質心,如C,則在Octave中運行voronoin(C)給我
error: voronoin: number of points must be greater than their dimension
那么有沒有辦法在這種情況下生成Voronoi區域 .
對于我的第二個問題,給出了一個很好的答案 .
我想問一下另一個相關的問題 . 由于Octave中的voronoin(C)不適用于C中的點數小于n(維數),我嘗試運行簡單的k-means 50次,得到50個聚類質心 . 然后,當我嘗試運行voronoin(C),其中C是一個大小為50X36的矩陣,所以有50個聚類質心,每個都是36維點,我得到以下錯誤 -
qhull error (qh_memalloc): insufficient memory
While executing: | qhull v Qbb Qx
Options selected for Qhull 2009.1 2009/06/14:
voronoi Qbbound-last Qxact-merge _zero-centrum Pgood
Q3-no-merge-vertices-dim-high _max-width 1.6 Error-roundoff 9.4e-14
_one-merge 7.6e-12 _near-inside 3.8e-11 Visible-distance 5.6e-13
U-coplanar-distance 5.6e-13 Width-outside 1.1e-12 _wide-facet 3.4e-12
Last point added to hull was p23.
At error exit:
Voronoi diagram by the convex hull of 50 points in 40-d:
Number of Voronoi regions: 48
Total number of nearly incident points: 2
Number of Voronoi vertices: 0
Statistics for: | qhull v Qbb Qx
Number of points processed: 48
Number of hyperplanes created: 5070358
Number of facets in hull: 4320576
Number of distance tests for qhull: 1525377
error: voronoin: qhull failed
warning: voronoin: qhull did not free -2099969864 bytes of long memory (1 pieces)
我想我做錯了什么,但我無法弄明白 . 我還查看了我可以提供的選項以及此處提供的voronoin()
但我似乎無法弄清楚他們是否會在這里幫助我
這是50個集群質心的鏈接
這是我正在運行的代碼
C = dlmread('clust_centroids');
[Vc,Vf] = voronoin(C);
這給了我上面給出的錯誤 .