📄 fcmdemo.m
字号:
labelH = line(x', y', 'LineStyle', 'none', 'Marker', 'o', 'visible', 'off');
set(labelH, 'erase', 'xor');
set(findobj(FcmFigH, 'tag', 'label_data'), 'userdata', labelH),
elseif strcmp(action, 'label_data'),
cluster_n = get(findobj(FcmFigH, 'tag', 'cluster_number'), 'value')+1;
dataplotH = get(findobj(FcmFigH, 'tag', 'data_set'), 'userdata');
data = get(dataplotH, 'userdata');
labelH = get(findobj(FcmFigH, 'tag', 'label_data'), 'userdata');
label_data = get(findobj(FcmFigH, 'tag', 'label_data'), 'value');
if label_data ~= 0,
set(dataplotH, 'visible', 'off');
maxU = max(FcmU);
for i = 1:cluster_n,
index = find(FcmU(i, :) == maxU);
cluster = data(index', :);
if isempty(cluster), cluster = [nan nan]; end
set(labelH(i), 'xdata', cluster(:, 1), ...
'ydata', cluster(:, 2));
end
set(labelH, 'visible', 'on');
else
set(dataplotH, 'visible', 'on');
set(labelH, 'visible', 'off');
end
elseif strcmp(action, 'get_data'),
getDataH = findobj(FcmFigH, 'tag', 'data_set');
dataID = get(getDataH, 'value');
no_change = 0;
if dataID == 1,
data_n = 400;
data = rand(data_n, 2);
% === cluster 1
dist1 = distfcm([0.2 0.2], data);
index1 = (dist1 < 0.15)';
% === cluster 2
dist2 = distfcm([0.7 0.7], data);
index2 = (dist2 < 0.25)';
% === cluster 3
index3 = data(:,1) - data(:, 2) - 0.1 < 0;
index4 = data(:,1) - data(:, 2) + 0.1 > 0;
index5 = data(:,1) + data(:, 2) - 0.4 > 0;
index6 = data(:,1) + data(:, 2) - 1.4 < 0;
% === final data
data(find((index1|index2|(index3&index4&index5&index6)) ...
== 0), :) = [];
elseif dataID == 2,
data_n = 100;
% === cluster 1
c1 = [0.6 0.2]; radius1 = 0.2;
data1 = randn(data_n, 2)/10 + ones(data_n, 1)*c1;
% === cluster 2
c2 = [0.2 0.6]; radius2 = 0.2;
data2 = randn(data_n, 2)/10 + ones(data_n, 1)*c2;
% === cluster 3
c3 = [0.8 0.8]; radius3 = 0.2;
data3 = randn(data_n, 2)/10 + ones(data_n, 1)*c3;
% === final data
data = [data1; data2; data3];
index = (min(data')>0) & (max(data')<1);
data(find(index == 0), :) = [];
elseif dataID == 3,
data_n = 100;
k = 10;
c1 = [0.125 0.25];
data1 = randn(data_n, 2)/k + ones(data_n, 1)*c1;
c2 = [0.625 0.25];
data2 = randn(data_n, 2)/k + ones(data_n, 1)*c2;
c3 = [0.375 0.75];
data3 = randn(data_n, 2)/k + ones(data_n, 1)*c3;
c4 = [0.875 0.75];
data4 = randn(data_n, 2)/k + ones(data_n, 1)*c4;
data = [data1; data2; data3; data4];
index = (min(data')>0) & (max(data')<1);
data(find(index == 0), :) = [];
elseif dataID == 4,
data_n = 100;
% === cluster 1
c1 = [0.2 0.2];
data1 = randn(data_n, 2)/15 + ones(data_n, 1)*c1;
% === cluster 2
c2 = [0.2 0.5];
data2 = randn(data_n, 2)/15 + ones(data_n, 1)*c2;
% === cluster 3
c2 = [0.2 0.8];
data3 = randn(data_n, 2)/15 + ones(data_n, 1)*c2;
% === cluster 4
c3 = [0.8 0.5];
data4 = randn(data_n, 2)/10 + ones(data_n, 1)*c3;
% === final data
data = [data1; data2; data3; data4];
index = (min(data')>0) & (max(data')<1);
data(find(index == 0), :) = [];
elseif dataID == 5,
data_n = 300;
data = rand(data_n, 2);
elseif dataID == 6, % Customized data set
data_file = uigetfile('*.dat');
if data_file == 0 | data_file == '', % cancelled
no_change = 1;
else % loading data
eval(['load ' data_file]);
tmp = find(data_file=='.');
if tmp == [], % data file has no extension.
eval(['data=' data_file ';']);
else
eval(['data=' data_file(1:tmp-1) ';']);
end
if size(data, 2) ~= 2,
fprintf('Given data is not 2-D!\n');
no_change = 1;
end
end
else
error('Selected data not found!');
end
if no_change,
set(getDataH, 'value', OldDataID);
else
% normalize data set
maxx = max(data(:,1)); minx = min(data(:,1));
data(:,1) = (data(:,1)-minx)/(maxx-minx);
maxy = max(data(:,2)); miny = min(data(:,2));
data(:,2) = (data(:,2)-miny)/(maxy-miny);
% process data
OldDataID = dataID;
delete(get(FcmAxisH, 'child'));
% set(FcmFigH, 'color', get(FcmFigH, 'color'));
refresh(FcmFigH);
dataplotH = line(data(:, 1), data(:, 2), 'color', 'g', ...
'LineStyle', 'none', 'Marker', 'o', 'visible', 'off', ...
'clipping', 'off');
set(dataplotH, 'userdata', data);
set(getDataH, 'userdata', dataplotH);
end
elseif strcmp(action, 'init_U'),
cluster_n = get(findobj(FcmFigH, 'tag', 'cluster_number'), ...
'value')+1;
dataplotH = get(findobj(FcmFigH, 'tag', 'data_set'), 'userdata');
data = get(dataplotH, 'userdata');
data_n = size(data, 1);
FcmU = initfcm(cluster_n, data_n);
elseif strcmp(action, 'display_data'),
label_data = get(findobj(FcmFigH, 'tag', 'label_data'), 'value');
dataplotH = get(findobj(FcmFigH, 'tag', 'data_set'), 'userdata');
labelH = get(findobj(FcmFigH, 'tag', 'label_data'), 'userdata');
if label_data == 0,
set(dataplotH, 'visible', 'on');
set(labelH, 'visible', 'off');
else
set(dataplotH, 'visible', 'off');
set(labelH, 'visible', 'on');
end
elseif strcmp(action, 'cluster_number'),
eval([mfilename, '(''init_U'')']);
delete(get(findobj(FcmFigH, 'tag', 'label_data'), 'userdata'));
delete(findobj(FcmFigH, 'tag', 'headH'));
delete(findobj(FcmFigH, 'tag', 'trajH'));
delete(findobj(FcmFigH, 'tag', 'selectH'));
FcmCenter = [];
set(findobj(FcmFigH, 'tag', 'mf_plot'), 'userdata', []);
eval([mfilename, '(''label_data0'')']);
eval([mfilename, '(''display_data'')']);
elseif strcmp(action, 'clear_traj'),
if ~isempty(findobj(FcmFigH, 'string', 'Start')),
% set(FcmFigH, 'color', get(FcmFigH, 'color'));
refresh(FcmFigH);
delete(findobj(FcmFigH, 'tag', 'trajH'));
end
elseif strcmp(action, 'clear_all'),
if ~isempty(findobj(FcmFigH, 'string', 'Start')),
% set(FcmFigH, 'color', get(FcmFigH, 'color'));
refresh(FcmFigH);
delete(findobj(FcmFigH, 'tag', 'headH'));
end
elseif strcmp(action, 'close'),
set(findobj(FcmFigH, 'string', 'Close'), 'userdata', 1);
if ~isempty(findobj(FcmFigH, 'string', 'Start')),
delete(FcmFigH);
end
elseif strcmp(action, 'mf_plot'),
old_pointer = get(FcmFigH, 'pointer');
set(FcmFigH, 'pointer', 'watch');
% looping till mouse action is done
which_cluster = get(findobj(FcmFigH, 'tag', 'mf_plot'), 'userdata');
if isempty(which_cluster),
fprintf('Use mouse to select a cluster first.\n');
else
title = ['MF Plot for Cluster ', int2str(which_cluster)];
MfFigH = findobj(0, 'Name', title);
if isempty(MfFigH), % create a new MF plot
dataplotH = get(findobj(FcmFigH, 'tag', 'data_set'), 'userdata');
data = get(dataplotH, 'userdata');
tmp = FcmU';
% use griddata to do surface plot
fprintf('Using "griddata" to plot MF surface ...\n');
[XI, YI] = meshgrid(0:0.1:1, 0:0.1:1);
ZI = griddata(data(:,1), data(:, 2), tmp(:, which_cluster), XI, YI);
% Create a new figure window
pos = get(0, 'defaultfigurepos');
pos(3) = pos(3)*0.75; pos(4) = pos(4)*0.75;
MfFigH = figure('Name', title, ...
'NumberTitle', 'off', 'position', pos, 'DockControls','off');
% V4 color default
colordef(MfFigH, 'black');
mesh(XI, YI, ZI);
xlabel('X'), ylabel('Y'), zlabel('MF');
axis([0 1 0 1 0 1]); set(gca, 'box', 'on');
rotate3d on;
set(MfFigH, 'HandleVisibility', 'callback');
end
set(0, 'Currentfigure', MfFigH);
end
set(FcmFigH, 'pointer', old_pointer);
elseif strcmp(action, 'set_mouse_action'),
% action when button is first pushed down
action1 = [mfilename '(''mouse_action1'')'];
% actions after the mouse is pushed down
action2 = ' ';
% action when button is released
action3 = ' ';
% temporary storage for the recall in the down_action
set(gca,'UserData',action2);
% set action when the mouse is pushed down
down_action=[ ...
'set(gcf,''WindowButtonMotionFcn'',get(gca,''UserData''));' ...
action1];
set(gcf,'WindowButtonDownFcn',down_action);
% set action when the mouse is released
up_action=[ ...
'set(gcf,''WindowButtonMotionFcn'','' '');', action3];
set(gcf,'WindowButtonUpFcn',up_action);
elseif strcmp(action, 'mouse_action1'),
curr_info = get(gca, 'CurrentPoint');
CurrPt = [curr_info(1, 1) curr_info(1,2)];
if ~isempty(FcmCenter),
[junk, which_cluster] = min(distfcm(CurrPt, FcmCenter));
set(findobj(gcf, 'tag', 'mf_plot'), 'userdata', which_cluster);
delete(findobj(gcf, 'tag', 'selectH'));
selectH = line(FcmCenter(which_cluster, 1), FcmCenter(which_cluster, 2), ...
'tag', 'selectH', 'LineStyle', 'none', 'Marker', 'o', 'markersize', 30);
end
elseif strcmp(action, 'exponent'),
expo = str2double(get(findobj(FcmFigH, 'tag', 'exponent'), 'string'));
if expo <= 1,
fprintf('The exponent for MF''s should be greater than 1!\n');
set(findobj(FcmFigH, 'tag', 'exponent'), 'string', num2str(1.01));
end
elseif strcmp(action, 'info'),
helpwin(mfilename);
% title = '2-D Fuzzy C-means Clustering';
% help_string = ...
% [' You are seeing fuzzy C-means clustering '
% ' when the data sets are 2-dimensional. You can '
% ' choose the data set and clustering number from '
% ' the GUI buttons at right, and then click '
% ' "Start" to start the fuzzy clustering process. '
% ' '
% ' Once the clustering is done, you can select '
% ' one of the clusters by mouse and view the MF '
% ' surface by clicking the "MF Plot" button. '
% ' '
% ' If you choose to use a customized data set, '
% ' it must be 2-D data. Moreover, the data set '
% ' is normalized to within the unit cube '
% ' [0,1] X [0,1] before being clustered. '
% ' '
% ' File name: fcmdemo.m '];
% fhelpfun(title, help_string);
else
fprintf('Given string is "%s".\n', action);
error('Unrecognized action string!');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -