2017-01-02 49 views
1
q = 2; 
k= 2^q; 
x1 = [0.0975000000000000, 0.980987500000000, -0.924672950312500, -0.710040130079246]; 

for i = 1 : length(x1) 
    [idx_centers,location] = kmeans(x1',q); 
end 

temp = idx_centers; 

for i = 1 : length(x1) 
    if temp(i)== 2 
     idx_centers(i) = 0; 
    end 
    BinaryCode_KMeans(i) = idx_centers(i); % output is say [0,0,1,1]; 
end 

strng = num2str(BinaryCode_KMeans); 
DecX = bin2dec(strng); 

符號在上面的代碼段十進制的轉換,我想表達的二進制串,其中從kmeans聚類得到的二進制串的十進制數。十進制等效值應爲1,2,3或4,即當q=2時爲k = 2^qMatlab的:二進制使用來自聚類算法

但有時在轉換後,十進制等效值是12,因爲對於4位二進制代碼,我們可以得到1到16或0到15的十進制數。x1中元素的數量可以變化,可以小於或大於比k。我應該怎麼做才能使k內的二進制代碼的十進制等於q的任何值?

+0

您是否注意到您將'q'而不是'k'作爲簇的數量?這意味着你只有2個簇而不是4個,在你的答案中,你指出十進制值可以是1,2,3或4,它表示簇的數目爲4.另外,小數到二進制轉換工作精細。我認爲這很模糊,你需要改變你想編碼kmeans結果的方式! – hmofrad

+0

@hmofrad:因爲有2個簇或2個符號,所以我通過'q'。 'x1'數組中的每個元素將屬於聚類1或聚類2.結果,將產生包含符號1,2的4個元素的數組。這是變量'idx_centers'。我將這個數組作爲一個字符串處理,並用'0'替換符號'2'以得到一個二進制字符串'BinaryCode_KMeans'。我將這個字符串轉換爲它的十進制等效值,它應該是1,2,3或4.基本上,我希望十進制數字在'k'的範圍內。爲此,我應該如何聚類,'kmeans'應該是什麼'q' – SKM

+0

鑑於你無法控制'kmeans'中簇名的順序,它可以產生'idx_centers = [1 2 2 2]'或' idx_centers = [2 1 1 1]',那麼二進制字符串將是'string = [1 0 0 0]'或'string = [0 1 1 1]',十進制值將是'8'或'7' 。你如何解釋這些結果,因爲你不能在這裏有1到4之間的小數值? – hmofrad

回答

1

首先,不需要多次運行kmeans,它會使用一次運行來計算聚類中心。請注意,下面的代碼嘗試查找聚類結果和樣本數量之間的映射。在下面的代碼中有三種方法來編碼這些信息。

clear 
clc 

q = 2; 
k= 2^q; 
n = 4; 
x1 = rand(n,1); 
fprintf('x1 = [ '); fprintf('%d ', x1); fprintf(']\n'); 

[idx_centers, location] = kmeans(x1, q); 
fprintf('idx_centers = [ '); fprintf('%d ', idx_centers); fprintf(']\n'); 

for i = 1:q 
    idx_centers(idx_centers == i) = i-1; 
end 

fprintf('idx_centers = [ '); fprintf('%d ', idx_centers); fprintf(']\n'); 

string = num2str(idx_centers'); 

% Original decimal value 
DecX = bin2dec(string); 
fprintf('0 to  (2^n) - 1: %d\n', DecX); 

% Reduced space decimal value 
% Ignoring the 0/1 order as [ 1 1 0 0 ] 
% would be the same  as [ 0 0 1 1 ] 
if DecX >= (2^n)/2 
    complement = bitget(bitcmp(int64(DecX)),n:-1:1); 
    DecX = bin2dec(num2str(complement)); 
end 
fprintf('0 to ((2^n)/2) - 1: %d\n', DecX); 

% Minimal Decimal value based on the number of samples 
% in the 0's cluster which is in the range of 0 to n-1 
fprintf('0 to   n - 1: %d\n', numel(find(idx_centers == 0))); 

提示:如果您更改q超過200,代碼將無法工作,因爲bin2dec只接受零和的。如果擁有2個以上的羣集,則需要詳細說明代碼並使用多維數組來存儲成對的羣集結果。

+0

謝謝你的回覆。但是我得到一個錯誤'未定義的函數'bitcmp'輸入參數的類型'int64'。'我有'bitcmp'函數,但不明白爲什麼會發生錯誤。另外,我應該得到的最終輸出是什麼?註釋'%原始十進制值 '下面的第一個'DecX'給出12.如何修復錯誤? – SKM

+0

我有另一個與此相關的問題,實際上這是繼續對這個問題在這裏問http://stackoverflow.com/questions/41387284/matlab-help-in-efficient-implementing-of-an-application-of- K均值聚類。如果你能回答這個問題,那麼你會非常友善,我相信你也可以在這個問題上提供幫助。 – SKM

+0

嘗試'哪個bitcmp'來查看Matlab是否找到函數路徑。它可能會返回'找不到bitcmp'或'沒有可用的許可證'。根據輸出,嘗試解決問題。順便說一句,我正在與_Matlab R2016b_合作。而且,由於代碼使用的是隨機數據,每次最終的聚類值都會不同。第二種表示方法(現在不適用於您)將12轉換爲3,忽略0和1的位置。最後,當然,我會看看你的另一個問題! – hmofrad