Matlab: двоичное в десятичное преобразование с использованием символов из алгоритма кластеризации

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, т. Е. k = 2^q когда q=2,

Но иногда после преобразования десятичный эквивалент равен 12, потому что для 4-битного двоичного кода мы получаем десятичные числа от 1 до 16 или от 0 до 15. количество элементов в x1 может варьироваться и может быть меньше или больше, чем k, Что я должен сделать, чтобы я всегда мог получить десятичный эквивалент двоичного кода в k для любого значения q?

1 ответ

Решение

Во-первых, нет необходимости запускать kmeans Несколько раз он будет вычислять центры кластеров, используя один прогон. Обратите внимание, что приведенный ниже код пытается найти соответствие между результатами кластеризации и n количество образцов. В приведенном ниже коде есть три способа кодирования этой информации.

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 более чем на 2, код не будет работать, потому что bin2dec принимает только нули и единицы. В случае наличия более 2 кластеров, вам необходимо разработать код и использовать многомерные массивы для хранения результатов попарной кластеризации.

Другие вопросы по тегам