Matlab:使用聚类算法中的符号进行二进制到十进制的转换
Matlab : Binary to decimal conversion using symbols from clustering algorithm
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
聚类中获得的。当 q=2
.
时,十进制等效值应为 1、2、3 或 4,即 k = 2^q
但有时在转换后,十进制等价物是 12,因为对于 4 位二进制代码,我们得到 1 到 16 或 0 - 15 之间的十进制数。x1
中的元素数可以变化并且可以小于或大于 k
。对于 q
的任何值,我应该怎么做才能始终获得 k
内的二进制代码的十进制等效值?
首先,不需要多次运行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个聚类,则需要详细说明代码并使用多维数组来存储成对聚类结果。
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
聚类中获得的。当 q=2
.
k = 2^q
但有时在转换后,十进制等价物是 12,因为对于 4 位二进制代码,我们得到 1 到 16 或 0 - 15 之间的十进制数。x1
中的元素数可以变化并且可以小于或大于 k
。对于 q
的任何值,我应该怎么做才能始终获得 k
内的二进制代码的十进制等效值?
首先,不需要多次运行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个聚类,则需要详细说明代码并使用多维数组来存储成对聚类结果。