function [center, U, obj_fcn] = kfcmFun(data, cluster_n,maxit, kernel_b,expo)
data_n = size(data, 1); % 求出data的第一維(rows)數,即樣本個數
obj_fcn = zeros(100, 1);% 初始化輸出參數obj_fcn
U = initkfcm(cluster_n, data_n);% 初始化模糊分配矩陣,使U滿足列上相加為1
index = randperm(data_n); % 對樣本序數隨機排列
center_old = data(index(1:cluster_n),:); % 選取隨機排列的序數的前cluster_n個
for i = 1:maxit
[U, center, obj_fcn(i)] = stepkfcm(data,U,center_old, expo, kernel_b);
fprintf('Iteration count = %d, obj. fcn = %f\n', i, obj_fcn(i));
center_old = center; % 用新的聚類中心代替老的聚類中心
% 終止條件判別
if i > 1
if abs(obj_fcn(i) - obj_fcn(i-1)) < 1e-5
break;
end
end
end
iter_n = i;
obj_fcn(iter_n+1:100) = [];
function U = initkfcm(cluster_n, data_n)
% 初始化fcm的隸屬度函數矩陣
U = rand(cluster_n, data_n);
col_sum = sum(U);
U = U./col_sum(ones(cluster_n, 1), :);
function [U_new,center_new,obj_fcn] = stepkfcm(data,U,center,expo,kernel_b)
% 模糊C均值聚類時迭代的一步
feature_n = size(data,2); % 特征維數
cluster_n = size(center,1); % 聚類個數
mf = U.^expo;
% 計算新的聚類中心;
KernelMat = gaussKernel(center,data,kernel_b); % 計算高斯核矩陣
num = mf.*KernelMat * data;
den = sum(mf.*KernelMat,2);
center_new = num./(den*ones(1,feature_n));
% 計算新的隸屬度矩陣;
kdist = distkfcm(center_new, data, kernel_b); % 計算距離矩陣
obj_fcn = sum(sum((kdist.^2).*mf)); % 計算目標函數值
tmp = kdist.^(-1/(expo-1));
U_new = tmp./(ones(cluster_n, 1)*sum(tmp));
function out = distkfcm(center, data, kernel_b)
% 計算樣本點距離聚類中心的距離
cluster_n = size(center, 1);
data_n = size(data, 1);
out = zeros(cluster_n, data_n);
for i = 1:cluster_n % 對每個聚類中心
vi = center(i,:);
out(i,:) = 2-2*gaussKernel(vi,data,kernel_b);
end
function out = gaussKernel(center,data,kernel_b)
% 高斯核函數計算
dist = zeros(size(center, 1), size(data, 1));
for k = 1:size(center, 1)
dist(k, :) = sqrt(sum(((data-ones(size(data,1),1)*center(k,:)).^2)',1));
end
out = exp(-dist.^2/kernel_b^2);
一鍵復制
編輯
Web IDE
原始數據
按行查看
歷史