FCM模糊聚类M码
源代码,本来用于数模题目中的电网设计
function [clusterResult,U,iter_n] = FCM(upPresureSite, windMachineSites, clusterNum, m)
% 输入:
% clusterNum:聚类个数,1 < K < N(点个数)
% m:模糊指数,1 < m < +无穷
% upPresureSite:升压站坐标,1 x 2 矩阵
% windMachineSites:风机坐标,N x 2 矩阵
% maxWMNum:一串最大风机数,缺省时为5
% minWMNum:一串最小风机数,缺省时为3
%% 1- 初始化 U0 以及 初始化变量
% maxWMNum = 5;
% minWMNum = 3;
[dataNum,dimention] = size(windMachineSites) ;
upPresureSiteMatrix = repmat(upPresureSite,[dataNum,1]);
windMachineSites = windMachineSites - upPresureSiteMatrix; % 以升电站为原点
epsilon = 1e-40; % 收敛精度,epsilon > 0
iters = 10000 ; % 模糊聚类迭代次数
Uexpo = 2 ; % 隶属度指数
% 随机初始化 模糊划分矩阵:U0,使U0满足列上相加为1
U0 = rand(clusterNum,dataNum);
U0=U0./(ones(clusterNum,1)*sum(U0));
U = U0 ;
% 初始化聚类中心
centerMatrix = zeros(clusterNum,dimention);
% 初始化价值函数矩阵
valueFunctionMatrix = zeros(iters,1);
% FCM 循环开始
for iterCount = 1:iters
%% 2- 计算clusterNum 个聚类中心
Uout = U .* Uexpo; % 隶属度指数相乘
centerMatrix = (Uout * windMachineSites) ./ sum(U(clusterNum,:));
%% 3- 计算 价值函数
% 3.1- 计算 距离矩阵
distMatrix = zeros(clusterNum, dataNum);
% 遍历clusterNum个聚类中心
for clusterCount = 1:clusterNum
% 求当前聚类中心求与所有样本点距离
for dataCount = 1:dataNum
distMatrix(clusterCount,dataCount) = ...
norm( centerMatrix(clusterCount,:) - windMachineSites(dataCount,:) );
end
end
% 3.2- 计算价值函数 值
distMatrix2 = distMatrix .^ 2; % 平方
valueFunctionMatrix(iterCount) = sum(sum(distMatrix2 .* Uout));
%% 4- 计算新的 模糊划分矩阵U
for i = 1:clusterNum
for j = 1:dataNum
DijVector = distMatrix(i,j) * ones(clusterNum,1);
DNjVector = distMatrix(:,j);
temp = (DijVector ./ DNjVector).^(2/(Uexpo-1));
temp = sum(temp);
valueFunctionMatrix(i,j) = 1 / temp;
end
end
%% 5- 算法终止条件判断
if iterCount > 1 && abs(valueFunctionMatrix(iterCount) - valueFunctionMatrix(iterCount-1)) <= epsilon
break;
end
end
iter_n = iterCount; % 实际迭代次数
[max_U,clusterAns]=max(U);
clusterResult = [ windMachineSites+upPresureSiteMatrix , clusterAns' ] ;