K-means算法&模糊Cmeans算法

  • 数据集 winequality
    • 1.来源
    • 2.意义
  • K-means算法
    • 1.定义
    • 2.算法
    • 3.代码实现
    • 4.运行结果
    • 5.结果分析
  • 模糊C-means算法
    • 1.定义
    • 2.算法
    • 3.代码实现
    • 4.运行结果
    • 5.结果分析
  • K-means算法与模糊C-means算法比较

数据集 winequality

1.来源

本数据集来源于UCI数据集。UCI数据集是一个常用的机器学习标准测试数据集,是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库。

2.意义

输入包括客观测试(如ph值等),输出基于感官数据(葡萄酒专家至少3次评估的中位数)。每个专家都对葡萄酒的质量进行分级介于0(非常差)和10(非常好)之间。共有11个属性和一个输出属性。
输入变量(基于物理化学测试):
1-固定酸度
2-挥发性酸度
3-柠檬酸
4-残糖
5-氯化物
6 -游离二氧化硫
7 -总二氧化硫
8-密度
9相
10-硫酸盐
11-酒精
输出变量(基于感官数据):
12-质量(0到10分)

K-means算法

1.定义

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。

2.算法

1.在点阵中随机找k个类的中心点
2.算出点阵中的若干点与各中心点的距离,根据距离将点归类
3.归类后重新找合适的中心点,迭代若干次

3.代码实现

clear
data=load('winequality.txt');
data1=data(:,2:12);
K=5;%% 产生随机初始点
[numOfData,numOfAttr]=size(data1);   % numOfData是数据个数,numOfAttr是数据维数centroids=zeros(K,numOfAttr);       % 随机初始化,最终迭代到每一类的中心位置
maxAttr=zeros(numOfAttr);        % 每一维最大的数
minAttr=zeros(numOfAttr);        % 每一维最小的数
for i=1:numOfAttrmaxAttr(i)=max(data1(:,i));    % 每一维最大的数minAttr(i)=min(data1(:,i));    % 每一维最小的数for j=1:Kcentroids(j,i)=maxAttr(i)+(minAttr(i)-maxAttr(i))*rand();  % 随机初始化聚类中心end
end[Idx,C,distance]=KMeans2(data1,K,centroids,500);% 调用KMeans2
Distance=sum(distance)     % 计算类内距离之和%% 计算准确率
c1=Idx(1:53,1);c2=Idx(54:734,1);c3=Idx(735:1372,1);
c4=Idx(1373:1571,1);c5=Idx(1572:1599,1);
Accuracy=(sum(c1==mode(Idx(1:53,1)))+sum(c2==mode(Idx(54:734,1)))+sum(c3==mode(Idx(735:1372,1)))+sum(c4==mode(Idx(1373:1571,1)))+sum(c5==mode(Idx(1572:1599,1))))/numOfData
C   %输出聚类中心矩阵%% Kmeans算法
% 输入:
% data 输入的不带分类标号的数据
% K 数据一共分多少类
% iniCentriods 自行指定初始聚类中心
% iterations 迭代次数% 输出:
% Idx 返回的分类标号
% centroids 每一类的中心
% Distance 类内总距离function [Idx,centroids,Distance]=KMeans2(data,K,iniCentriods,iterations)
[numOfData,numOfAttr]=size(data); % numOfData是数据个数,numOfAttr是数据维数
centroids=iniCentriods;
%% 迭代
for iter=1:iterationspre_centroids=centroids;% 上一次求得的中心位置tags=zeros(numOfData,K);%% 寻找最近中心,更新中心for i=1:numOfDataD=zeros(1,K);% 每个数据点与每个聚类中心的标准差Dist=D;% 计算每个点到每个中心点的标准差for j=1:KDist(j)=norm(data(i,:)-centroids(j,:),2);   %norm( ,2) 平方和开根号 即标准差end[minDistance,index]=min(Dist);% 寻找距离最小的类别索引tags(i,index)=1;% 标记最小距离所处的位置(类别)end%% 取均值更新聚类中心点for i=1:Kif sum(tags(:,i))~=0% 未出现空类,计算均值作为下一聚类中心for j=1:numOfAttrcentroids(i,j)=sum(tags(:,i).*data(:,j))/sum(tags(:,i));endelse % 如果出现空类,从数据集中随机选中一个点作为中心randidx = randperm(size(data, 1));centroids(i,:) = data(randidx(1),:);tags(randidx,:)=0;tags(randidx,i)=1;endendif sum(norm(pre_centroids-centroids,2))<0.001  % 不断迭代直到位置不再变化break;endend%% 计算输出结果
Distance=zeros(numOfData,1);
Idx=zeros(numOfData,1);
for i=1:numOfDataD=zeros(1,K);% 每个数据点与每个聚类中心的标准差Dist=D;% 计算每个点到每个中心点的标准差for j=1:KDist(j)=norm(data(i,:)-centroids(j,:),2);end[distance,idx]=min(Dist);% 寻找距离最小的类别索引distance=Dist(idx);Distance(i)=distance;Idx(i)=idx;
end
Distance=sum(Distance,1);% 计算类内总距离
end

值得一提的是,由于下载的数据是csv格式,不能很好的导入进行聚类,因此在这里多做了一步整理数据集的工作。

clear
clc
% 整理winequality数据集f=fopen('winequality.data');% 打开文件
data=textscan(f,'%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f,%f'); % 读取数据D=[];% D中存放属性值
for i=1:length(data)-1D=[D data{1,i}];
end
fclose(f);lable=data{1,length(data)};
n1=0;n2=0;n3=0;n4=0;n5=0;
% 找到每类数据的索引
for j=1:length(lable)
% 根据每种葡萄酒的评分来划分类别 将评分为4的分为第一类,评分为5的分为第二类,评分为6的分为第三类,评分为7的分为第四类,其他的评分分为第五类
%这里的分类完全是根据自己的喜好随便分的if lable(j,1)==4n1=n1+1;index_1(n1)=j; elseif lable(j,1)==5n2=n2+1;index_2(n2)=j;elseif lable(j,1)==6n3=n3+1;index_3(n3)=j;elseif lable(j,1)==7n4=n4+1;index_4(n4)=j;elseif lable(j,1)<4 || lable(j,1)>7n5=n5+1;index_5(n5)=j;end
end% 按照索引取出每类数据,重新组合
class_1=D(index_1,:);
class_2=D(index_2,:);
class_3=D(index_3,:);
class_4=D(index_4,:);
class_5=D(index_5,:);
Attributes=[class_1;class_2;class_3;class_4;class_5];I=[1*ones(n1,1);2*ones(n2,1);3*ones(n3,1);4*ones(n4,1);5*ones(n5,1)];
winequality=[I Attributes];% 为各类添加数字标记save winequality.mat winequality % 保存.mat文件
save winequality -ascii winequality; % 保存data文件f=fopen('winequality.txt','w');
[m,n]=size(winequality);
for i=1:mfor j=1:nif j==nfprintf(f,'%g \n',winequality(i,j));elsefprintf(f,'%g,',winequality(i,j));endend
end

4.运行结果

运行一次:

运行两次:

运行三次:

运行四次:

运行五次:

5.结果分析

1 由于本次数据集是一个大于二维的11维数据集,因此不能用可视化的方式画出聚类图象,只能用文字输出聚类中心点的矩阵。
2 精度的计算:由于做了重新整理数据的工作,整理后的数据集的第一列是分类的标号,整理后的数据集也根据分类标号从小到大重新排列。根据对数据集的类别数计算,可以得出每个类别的数据个数。采用一个简单的方式计算精度:确定每个类别的数据点中的聚类标号是不是与计算出的类别标号矩阵的标号一致。取计算出的类别标号矩阵之中数目最多的标号作为正确的个数,最终比上数据集的总数即为准确率。
3 距离的计算:取每个点与中心点的标准差。

模糊C-means算法

1.定义

模糊c-均值聚类算法 fuzzy c-means algorithm (FCMA)或称( FCM)。在众多模糊聚类算法中,模糊C-均值( FCM) 算法应用最广泛且较成功,它通过优化目标函数得到每个样本点对所有类中心的隶属度,从而决定样本点的类属以达到自动对样本数据进行分类的目的。
在实际问题中,对象ui往往不是严格归属于某一类,而是以一定的隶属度隶属于某一类,因此,每一类可以认为是U上的一个模糊子集。如果对象集U
被分成c类,则每一种分类结果对应的矩阵是一个模糊矩阵R,其中的每一个元素满足:①取值在0到1之间 ②每一列元素和为1 ③每一行元素和大于0
反之,任一满足上述三条性质的矩阵都对应着U的一种模糊聚类。于是,研究模糊聚类问题可归结为研究满足以上三条性质的模糊矩阵问题。
聚类准则:求出适当的模糊分类矩阵和聚类中心矩阵,使目标函数

达到极小值。这里的m为参数,w后的平方公式表示对象与聚类中心的向量距离。

2.算法

1 设定分类个数 k,设定初始模糊分类矩阵,随机给定 0~1 之值,并满足每一列的隶属度元素总和为1
2 对于初始模糊分类矩阵,计算聚类中心向量

3 更新模糊聚类矩阵

4 比较当前模糊聚类矩阵与之前的模糊聚类矩阵,若两者相差低于给定精度,停止迭代,否则返回第二步重复进行。

3.代码实现

function[center, U, obj_fcn] = fcm_final(data,c,options)
% 输入:
% data 数据集 n行m列,n为样本数据数,m为数据的特征数
% c 聚类中心的个数
%options(1): 隶属度矩阵U的指数expo,>1(缺省值: 2.0)
%options(2): 最大迭代次数max_t(缺省值: 100)
%options(3): 隶属度最小变化量e,迭代终止条件(缺省值: 1e-5)
%options(4): 每次迭代是否输出信息标志(缺省值: 1)
% 输出:
% U 隶属度矩阵
% center 聚类中心
% obj_fcn 目标函数% 判断输入参数的个数只能是2个或者3个
if nargin ~= 2 && nargin ~= 3error('Too many or too few input argument! ');
end
data_n = size(data, 1);% 求数据的行,即样本个数
data_m = size(data, 2);% 求数据的列,即特征个数% 默认操作参数
default_options = [2; 100; 1e-2; 1];% 如果输入参数个数为2,调用默认的options参数
if nargin == 2,options = default_options;
else % 分析有options做参数的情况:% 用户在输入options参数时需注意,如果options参数的个数少于4个,则未输入参数的对应位置用nan来代替,这样可以保证未输入参数采用的是默认值,否则可能会出现前面参数占用后面参数的值的情况,从而影响聚类效果。if length(options) < 4,temp = default_options;temp(1:length(options)) = options;options = temp;end% 返回options中值为NaN的索引位置nan_index = find(isnan(options) == 1);% 将default_options中对应位置的参数值付给options中值为NaN的值options(nan_index) = default_options(nan_index);if options(1) <= 1,% 模糊因子是大于1的数error('The exponent should be greater than 1 !');endend% 将options中的分量分别复制给四个变量
expo = options(1);%模糊因子m
max_t = options(2);% 最大迭代次数
e = options(3);%迭代终止条件
display = options(4);%输出信息% 目标函数初始化
obj_fcn = zeros(max_t, 1);
U = initfcm(c, data_n);
% 初始化模糊分配矩阵,使U满足列上相加值为1% 主要循环
for i = 1 : max_t% 在第k步循环中改变聚类中心center和隶属矩阵U[U, center, obj_fcn(i)] = stepfcm(data, U, c, expo);if display,fprintf('FCM:Iteration count = %d, obj_fcn = %f\n',i,obj_fcn(i));plotfcm(data,center,U,obj_fcn);end%迭代终止条件的判断if i > 1,if abs(obj_fcn(i) - obj_fcn(i-1)) < e,H=sum(sum(U.^2))/data_nbreak;endendend% 实际迭代次数
iter_n = i;
% 清除迭代次数之后的值
obj_fcn(iter_n + 1 : max_t) = [];
end% 初始化fcm的隶属度函数矩阵,满足列向量之和为1
% U--> c * n(c行n列) ,c为聚类数, n为样本数
%% 初始化隶属矩阵时需要已知矩阵的行和列,因此输入应该为该矩阵的行和列% 输入: c, data_n
% data_n  数据集data所含的样本数
% c       这组数据的聚类数
% 输出:U(初始化之后的隶属矩阵)function[U] = initfcm(c, data_n)% 初始化隶属矩阵U:rand函数可产生在(0, 1)之间均匀分布的随机数组成的数组。
rand('seed',sum(100*clock))
U = rand(c, data_n);%% 注意:隶属矩阵在初始化时需满足某数据j对各个聚类中心i(1<i<c)的隶属度之和为1.
%%% sum(U)是指对矩阵U进行纵向相加,即求每一列的和,结果是一个1行n列的矩阵。
%(sum函数后面参数不指定或指定为1时均表示列相加)。col_sum = sum(U);U = U./col_sum(ones(c,1), : );% col_sum(ones(c, 1),:)等效于ones(c,1)*col_sum   ones(c,1) c行1列的全1矩阵 矩阵乘法
% 上述目的是将col_sum扩展成与U(c,data_n)大小相同的矩阵,然后进行对应元素的点除,使隶属矩阵列项和为1。end% 一次聚类包含的过程:
% % (1)计算聚类中心,(2)目标函数,(3)距离函数,(4)计算新的隶属矩阵% 输入:data,U,c,expo(模糊因子)
% 输出:U_new(新的隶属矩阵),center(聚类中心),obj_fcn(目标函数)function[U_new, center, obj_fcn] = stepfcm(data, U, c, expo)% 对隶属矩阵进行指数运算(加上模糊因子)
mf = U.^expo; % 隶属矩阵模糊化
% 相当于一次性将所有聚类中心作为一个矩阵计算出来
center = mf*data./((ones(size(data,2),1)*sum(mf'))');   %mf' 将mf化为行向量  ((ones(size(data,2),1)*sum(mf'))')将mf化为与data大小相同的矩阵
dist = distfcm(center, data); % 计算距离矩阵
obj_fcn = sum(sum(dist.^2 .* mf)); % 计算目标函数
temp = dist.^(-2/(expo-1));
U_new = temp./(ones(c,1)*sum(temp)); % 计算新的隶属矩阵
end% 输入:data, center
% 输出:outfunction out = disfcm(center,data)
out = zeros(size(center, 1), size(data, 1)); % 对c行n列的距离输出矩阵进行置零
% 循环,每循环一次计算所有样本点到该聚类中心的距离
for k = 1:size(center, 1)out(k,:) = sqrt(sum(((data - ones(size(data,1),1)*center(k,:)).^2)',1));
end
end% 输入:data, center, U, obj_fcn
% 对winequality.txt进行聚类function plotfcm(data,center,U,obj_fcn)
figure(2)
grid on
plot(obj_fcn);
title('目标函数变化值');
xlabel('迭代次数')
ylabel('目标函数值')
end

4.运行结果

运行一次:

data=load(‘winequality2.txt’);
data1=data(:,1:11);
fcm_final(data1,5)
FCM:Iteration count = 1, obj_fcn = 500902.343769
FCM:Iteration count = 2, obj_fcn = 380293.058194
FCM:Iteration count = 3, obj_fcn = 361897.184388
FCM:Iteration count = 4, obj_fcn = 297032.692992
FCM:Iteration count = 5, obj_fcn = 223615.070590
FCM:Iteration count = 6, obj_fcn = 181657.883810
FCM:Iteration count = 7, obj_fcn = 160953.978377
FCM:Iteration count = 8, obj_fcn = 148254.987520
FCM:Iteration count = 9, obj_fcn = 140570.041404
FCM:Iteration count = 10, obj_fcn = 135840.232734
FCM:Iteration count = 11, obj_fcn = 132814.370752
FCM:Iteration count = 12, obj_fcn = 130922.017854
FCM:Iteration count = 13, obj_fcn = 129798.160210
FCM:Iteration count = 14, obj_fcn = 129158.229497
FCM:Iteration count = 15, obj_fcn = 128800.571857
FCM:Iteration count = 16, obj_fcn = 128599.744904
FCM:Iteration count = 17, obj_fcn = 128484.343269
FCM:Iteration count = 18, obj_fcn = 128415.649964
FCM:Iteration count = 19, obj_fcn = 128373.067977
FCM:Iteration count = 20, obj_fcn = 128345.606370
FCM:Iteration count = 21, obj_fcn = 128327.278862
FCM:Iteration count = 22, obj_fcn = 128314.712366
FCM:Iteration count = 23, obj_fcn = 128305.923334
FCM:Iteration count = 24, obj_fcn = 128299.690826
FCM:Iteration count = 25, obj_fcn = 128295.230276
FCM:Iteration count = 26, obj_fcn = 128292.018814
FCM:Iteration count = 27, obj_fcn = 128289.697985
FCM:Iteration count = 28, obj_fcn = 128288.016951
FCM:Iteration count = 29, obj_fcn = 128286.797699
FCM:Iteration count = 30, obj_fcn = 128285.912711
FCM:Iteration count = 31, obj_fcn = 128285.270100
FCM:Iteration count = 32, obj_fcn = 128284.803409
FCM:Iteration count = 33, obj_fcn = 128284.464468
FCM:Iteration count = 34, obj_fcn = 128284.218317
FCM:Iteration count = 35, obj_fcn = 128284.039567
FCM:Iteration count = 36, obj_fcn = 128283.909776
FCM:Iteration count = 37, obj_fcn = 128283.815543
FCM:Iteration count = 38, obj_fcn = 128283.747133
FCM:Iteration count = 39, obj_fcn = 128283.697475
FCM:Iteration count = 40, obj_fcn = 128283.661431
FCM:Iteration count = 41, obj_fcn = 128283.635270
FCM:Iteration count = 42, obj_fcn = 128283.616285
FCM:Iteration count = 43, obj_fcn = 128283.602507
FCM:Iteration count = 44, obj_fcn = 128283.592509
H =
0.6678
ans =
8.1440 0.5174 0.2705 2.4417 0.0939 23.9416 59.4597 0.9969 3.3290 0.6864 10.3103
8.2075 0.5276 0.2388 2.3226 0.0865 14.5394 36.8187 0.9967 3.3364 0.6456 10.4256
8.6667 0.5156 0.2921 2.4349 0.0855 6.8803 17.2261 0.9966 3.2951 0.6491 10.6554
8.1112 0.5631 0.3221 3.1139 0.0883 29.7652 132.4364 0.9972 3.2353 0.7121 9.7747
7.8206 0.5829 0.2497 2.8783 0.0868 22.3014 91.4425 0.9968 3.3260 0.6289 10.1136

运行两次:

fcm_final(data1,5)
FCM:Iteration count = 1, obj_fcn = 502488.609328
FCM:Iteration count = 2, obj_fcn = 378169.563923
FCM:Iteration count = 3, obj_fcn = 349179.701653
FCM:Iteration count = 4, obj_fcn = 273332.000368
FCM:Iteration count = 5, obj_fcn = 204261.743528
FCM:Iteration count = 6, obj_fcn = 168182.861688
FCM:Iteration count = 7, obj_fcn = 152758.478612
FCM:Iteration count = 8, obj_fcn = 144268.660286
FCM:Iteration count = 9, obj_fcn = 138892.881295
FCM:Iteration count = 10, obj_fcn = 135238.286703
FCM:Iteration count = 11, obj_fcn = 132727.879266
FCM:Iteration count = 12, obj_fcn = 131064.676918
FCM:Iteration count = 13, obj_fcn = 130013.871388
FCM:Iteration count = 14, obj_fcn = 129371.432139
FCM:Iteration count = 15, obj_fcn = 128982.530742
FCM:Iteration count = 16, obj_fcn = 128744.641741
FCM:Iteration count = 17, obj_fcn = 128595.595506
FCM:Iteration count = 18, obj_fcn = 128499.358556
FCM:Iteration count = 19, obj_fcn = 128435.322481
FCM:Iteration count = 20, obj_fcn = 128391.584501
FCM:Iteration count = 21, obj_fcn = 128361.089358
FCM:Iteration count = 22, obj_fcn = 128339.504826
FCM:Iteration count = 23, obj_fcn = 128324.067300
FCM:Iteration count = 24, obj_fcn = 128312.949964
FCM:Iteration count = 25, obj_fcn = 128304.908830
FCM:Iteration count = 26, obj_fcn = 128299.077306
FCM:Iteration count = 27, obj_fcn = 128294.841810
FCM:Iteration count = 28, obj_fcn = 128291.763088
FCM:Iteration count = 29, obj_fcn = 128289.524442
FCM:Iteration count = 30, obj_fcn = 128287.896525
FCM:Iteration count = 31, obj_fcn = 128286.712819
FCM:Iteration count = 32, obj_fcn = 128285.852253
FCM:Iteration count = 33, obj_fcn = 128285.226738
FCM:Iteration count = 34, obj_fcn = 128284.772169
FCM:Iteration count = 35, obj_fcn = 128284.441897
FCM:Iteration count = 36, obj_fcn = 128284.201980
FCM:Iteration count = 37, obj_fcn = 128284.027730
FCM:Iteration count = 38, obj_fcn = 128283.901193
FCM:Iteration count = 39, obj_fcn = 128283.809318
FCM:Iteration count = 40, obj_fcn = 128283.742617
FCM:Iteration count = 41, obj_fcn = 128283.694198
FCM:Iteration count = 42, obj_fcn = 128283.659053
FCM:Iteration count = 43, obj_fcn = 128283.633545
FCM:Iteration count = 44, obj_fcn = 128283.615032
FCM:Iteration count = 45, obj_fcn = 128283.601598
FCM:Iteration count = 46, obj_fcn = 128283.591849
H =
0.6678
ans =
7.8206 0.5829 0.2497 2.8783 0.0868 22.3013 91.4427 0.9968 3.3260 0.6289 10.1136
8.2075 0.5276 0.2388 2.3226 0.0865 14.5395 36.8188 0.9967 3.3364 0.6456 10.4256
8.1112 0.5631 0.3221 3.1139 0.0883 29.7652 132.4366 0.9972 3.2353 0.7121 9.7747
8.6667 0.5156 0.2921 2.4349 0.0855 6.8803 17.2261 0.9966 3.2951 0.6491 10.6554
8.1440 0.5174 0.2705 2.4417 0.0939 23.9417 59.4600 0.9969 3.3290 0.6864 10.3103
运行三次:

fcm_final(data1,5)
FCM:Iteration count = 1, obj_fcn = 508969.962867
FCM:Iteration count = 2, obj_fcn = 382201.286257
FCM:Iteration count = 3, obj_fcn = 376657.416705
FCM:Iteration count = 4, obj_fcn = 340564.515299
FCM:Iteration count = 5, obj_fcn = 260033.400391
FCM:Iteration count = 6, obj_fcn = 197816.927063
FCM:Iteration count = 7, obj_fcn = 163997.166172
FCM:Iteration count = 8, obj_fcn = 150087.629807
FCM:Iteration count = 9, obj_fcn = 143118.753567
FCM:Iteration count = 10, obj_fcn = 138891.268985
FCM:Iteration count = 11, obj_fcn = 135989.492178
FCM:Iteration count = 12, obj_fcn = 133852.572507
FCM:Iteration count = 13, obj_fcn = 132253.083589
FCM:Iteration count = 14, obj_fcn = 131079.485331
FCM:Iteration count = 15, obj_fcn = 130243.362705
FCM:Iteration count = 16, obj_fcn = 129660.211274
FCM:Iteration count = 17, obj_fcn = 129256.773405
FCM:Iteration count = 18, obj_fcn = 128976.948238
FCM:Iteration count = 19, obj_fcn = 128781.196648
FCM:Iteration count = 20, obj_fcn = 128642.819791
FCM:Iteration count = 21, obj_fcn = 128544.037897
FCM:Iteration count = 22, obj_fcn = 128472.958431
FCM:Iteration count = 23, obj_fcn = 128421.513369
FCM:Iteration count = 24, obj_fcn = 128384.132525
FCM:Iteration count = 25, obj_fcn = 128356.905206
FCM:Iteration count = 26, obj_fcn = 128337.047371
FCM:Iteration count = 27, obj_fcn = 128322.556283
FCM:Iteration count = 28, obj_fcn = 128311.980847
FCM:Iteration count = 29, obj_fcn = 128304.264831
FCM:Iteration count = 30, obj_fcn = 128298.637372
FCM:Iteration count = 31, obj_fcn = 128294.535132
FCM:Iteration count = 32, obj_fcn = 128291.546253
FCM:Iteration count = 33, obj_fcn = 128289.369654
FCM:Iteration count = 34, obj_fcn = 128287.785329
FCM:Iteration count = 35, obj_fcn = 128286.632613
FCM:Iteration count = 36, obj_fcn = 128285.794250
FCM:Iteration count = 37, obj_fcn = 128285.184725
FCM:Iteration count = 38, obj_fcn = 128284.741708
FCM:Iteration count = 39, obj_fcn = 128284.419799
FCM:Iteration count = 40, obj_fcn = 128284.185945
FCM:Iteration count = 41, obj_fcn = 128284.016092
FCM:Iteration count = 42, obj_fcn = 128283.892746
FCM:Iteration count = 43, obj_fcn = 128283.803186
FCM:Iteration count = 44, obj_fcn = 128283.738166
FCM:Iteration count = 45, obj_fcn = 128283.690968
FCM:Iteration count = 46, obj_fcn = 128283.656708
FCM:Iteration count = 47, obj_fcn = 128283.631843
FCM:Iteration count = 48, obj_fcn = 128283.613798
FCM:Iteration count = 49, obj_fcn = 128283.600702
FCM:Iteration count = 50, obj_fcn = 128283.591199
H =
0.6678
ans =
8.6667 0.5156 0.2921 2.4349 0.0855 6.8804 17.2262 0.9966 3.2951 0.6491 10.6554
8.1112 0.5631 0.3221 3.1139 0.0883 29.7652 132.4367 0.9972 3.2353 0.7121 9.7747
7.8206 0.5829 0.2497 2.8783 0.0868 22.3013 91.4428 0.9968 3.3260 0.6289 10.1136
8.2075 0.5276 0.2388 2.3226 0.0865 14.5396 36.8190 0.9967 3.3364 0.6456 10.4256
8.1440 0.5174 0.2705 2.4417 0.0939 23.9417 59.4602 0.9969 3.3290 0.6864 10.3103
运行四次:

fcm_final(data1,5)
FCM:Iteration count = 1, obj_fcn = 505518.664175
FCM:Iteration count = 2, obj_fcn = 382212.277480
FCM:Iteration count = 3, obj_fcn = 376775.626979
FCM:Iteration count = 4, obj_fcn = 342504.014625
FCM:Iteration count = 5, obj_fcn = 264873.327429
FCM:Iteration count = 6, obj_fcn = 200597.254752
FCM:Iteration count = 7, obj_fcn = 166850.015581
FCM:Iteration count = 8, obj_fcn = 152712.918489
FCM:Iteration count = 9, obj_fcn = 144563.118467
FCM:Iteration count = 10, obj_fcn = 139024.927044
FCM:Iteration count = 11, obj_fcn = 135133.426270
FCM:Iteration count = 12, obj_fcn = 132492.455895
FCM:Iteration count = 13, obj_fcn = 130810.853743
FCM:Iteration count = 14, obj_fcn = 129797.942274
FCM:Iteration count = 15, obj_fcn = 129205.956707
FCM:Iteration count = 16, obj_fcn = 128861.319684
FCM:Iteration count = 17, obj_fcn = 128657.293891
FCM:Iteration count = 18, obj_fcn = 128532.841697
FCM:Iteration count = 19, obj_fcn = 128454.174373
FCM:Iteration count = 20, obj_fcn = 128402.673043
FCM:Iteration count = 21, obj_fcn = 128367.915796
FCM:Iteration count = 22, obj_fcn = 128343.889614
FCM:Iteration count = 23, obj_fcn = 128326.986468
FCM:Iteration count = 24, obj_fcn = 128314.948284
FCM:Iteration count = 25, obj_fcn = 128306.304831
FCM:Iteration count = 26, obj_fcn = 128300.066359
FCM:Iteration count = 27, obj_fcn = 128295.549161
FCM:Iteration count = 28, obj_fcn = 128292.272064
FCM:Iteration count = 29, obj_fcn = 128289.892088
FCM:Iteration count = 30, obj_fcn = 128288.162715
FCM:Iteration count = 31, obj_fcn = 128286.905824
FCM:Iteration count = 32, obj_fcn = 128285.992306
FCM:Iteration count = 33, obj_fcn = 128285.328411
FCM:Iteration count = 34, obj_fcn = 128284.845994
FCM:Iteration count = 35, obj_fcn = 128284.495505
FCM:Iteration count = 36, obj_fcn = 128284.240908
FCM:Iteration count = 37, obj_fcn = 128284.055995
FCM:Iteration count = 38, obj_fcn = 128283.921715
FCM:Iteration count = 39, obj_fcn = 128283.824216
FCM:Iteration count = 40, obj_fcn = 128283.753432
FCM:Iteration count = 41, obj_fcn = 128283.702048
FCM:Iteration count = 42, obj_fcn = 128283.664750
FCM:Iteration count = 43, obj_fcn = 128283.637680
FCM:Iteration count = 44, obj_fcn = 128283.618033
FCM:Iteration count = 45, obj_fcn = 128283.603776
FCM:Iteration count = 46, obj_fcn = 128283.593430
FCM:Iteration count = 47, obj_fcn = 128283.585922
H =
0.6678
ans =
8.6667 0.5156 0.2921 2.4349 0.0855 6.8806 17.2267 0.9966 3.2951 0.6491 10.6554
8.1112 0.5631 0.3221 3.1139 0.0883 29.7654 132.4375 0.9972 3.2353 0.7121 9.7747
8.2075 0.5276 0.2388 2.3226 0.0865 14.5402 36.8206 0.9967 3.3364 0.6456 10.4256
8.1440 0.5174 0.2705 2.4417 0.0939 23.9422 59.4620 0.9969 3.3290 0.6864 10.3103
7.8205 0.5829 0.2497 2.8783 0.0868 22.3012 91.4441 0.9968 3.3260 0.6289 10.1136

运行五次:

fcm_final(data1,5)
FCM:Iteration count = 1, obj_fcn = 510309.902032
FCM:Iteration count = 2, obj_fcn = 381854.864674
FCM:Iteration count = 3, obj_fcn = 373701.992653
FCM:Iteration count = 4, obj_fcn = 332017.081404
FCM:Iteration count = 5, obj_fcn = 260552.160776
FCM:Iteration count = 6, obj_fcn = 203910.047531
FCM:Iteration count = 7, obj_fcn = 175512.651933
FCM:Iteration count = 8, obj_fcn = 161778.384793
FCM:Iteration count = 9, obj_fcn = 153343.815200
FCM:Iteration count = 10, obj_fcn = 148790.004684
FCM:Iteration count = 11, obj_fcn = 145693.668980
FCM:Iteration count = 12, obj_fcn = 143196.760326
FCM:Iteration count = 13, obj_fcn = 141039.399704
FCM:Iteration count = 14, obj_fcn = 139102.281306
FCM:Iteration count = 15, obj_fcn = 137324.345835
FCM:Iteration count = 16, obj_fcn = 135686.261181
FCM:Iteration count = 17, obj_fcn = 134201.724193
FCM:Iteration count = 18, obj_fcn = 132901.506820
FCM:Iteration count = 19, obj_fcn = 131811.265887
FCM:Iteration count = 20, obj_fcn = 130935.436078
FCM:Iteration count = 21, obj_fcn = 130255.928555
FCM:Iteration count = 22, obj_fcn = 129741.380118
FCM:Iteration count = 23, obj_fcn = 129357.489187
FCM:Iteration count = 24, obj_fcn = 129073.373270
FCM:Iteration count = 25, obj_fcn = 128863.906493
FCM:Iteration count = 26, obj_fcn = 128709.724172
FCM:Iteration count = 27, obj_fcn = 128596.309023
FCM:Iteration count = 28, obj_fcn = 128512.914723
FCM:Iteration count = 29, obj_fcn = 128451.623131
FCM:Iteration count = 30, obj_fcn = 128406.604819
FCM:Iteration count = 31, obj_fcn = 128373.565743
FCM:Iteration count = 32, obj_fcn = 128349.340681
FCM:Iteration count = 33, obj_fcn = 128331.595785
FCM:Iteration count = 34, obj_fcn = 128318.610575
FCM:Iteration count = 35, obj_fcn = 128309.117566
FCM:Iteration count = 36, obj_fcn = 128302.183915
FCM:Iteration count = 37, obj_fcn = 128297.123876
FCM:Iteration count = 38, obj_fcn = 128293.433987
FCM:Iteration count = 39, obj_fcn = 128290.745084
FCM:Iteration count = 40, obj_fcn = 128288.786812
FCM:Iteration count = 41, obj_fcn = 128287.361407
FCM:Iteration count = 42, obj_fcn = 128286.324355
FCM:Iteration count = 43, obj_fcn = 128285.570155
FCM:Iteration count = 44, obj_fcn = 128285.021854
FCM:Iteration count = 45, obj_fcn = 128284.623363
FCM:Iteration count = 46, obj_fcn = 128284.333825
FCM:Iteration count = 47, obj_fcn = 128284.123499
FCM:Iteration count = 48, obj_fcn = 128283.970743
FCM:Iteration count = 49, obj_fcn = 128283.859818
FCM:Iteration count = 50, obj_fcn = 128283.779280
FCM:Iteration count = 51, obj_fcn = 128283.720812
FCM:Iteration count = 52, obj_fcn = 128283.678371
FCM:Iteration count = 53, obj_fcn = 128283.647566
FCM:Iteration count = 54, obj_fcn = 128283.625208
FCM:Iteration count = 55, obj_fcn = 128283.608982
FCM:Iteration count = 56, obj_fcn = 128283.597208
FCM:Iteration count = 57, obj_fcn = 128283.588664
H =
0.6678
ans =
8.1112 0.5631 0.3221 3.1139 0.0883 29.7653 132.4371 0.9972 3.2353 0.7121 9.7747
8.1440 0.5174 0.2705 2.4417 0.0939 23.9420 59.4610 0.9969 3.3290 0.6864 10.3103
8.2075 0.5276 0.2388 2.3226 0.0865 14.5398 36.8197 0.9967 3.3364 0.6456 10.4256
7.8206 0.5829 0.2497 2.8783 0.0868 22.3013 91.4434 0.9968 3.3260 0.6289 10.1136
8.6667 0.5156 0.2921 2.4349 0.0855 6.8805 17.2264 0.9966 3.2951 0.6491 10.6554

5.结果分析

1 代码的运行结果是FCM迭代的次数和每次迭代的目标函数值,H是FCM的精度,最后输出各类的聚类中心点,跟K-means算法同理,由于聚类的矩阵是大于二维的高维矩阵,因此不能可视化显示,只能文字输出各聚类中心点
2 目标函数的计算是根据定义中的目标函数公式,在代码中体现为:先将隶属度矩阵模糊化(加上指数),然后计算出当前的聚类中心点(根据算法步骤2),再求当前聚类中心点与样本的距离,最后将模糊的隶属度与距离相乘求和。最后还要更新每个样本的隶属度,算出新的隶属度矩阵。
3 算法精度的计算:利用分类系数对聚类算法进行检验。分类系数F=每一个隶属度的平方求和再求平均值(除以n)。通过对分类系数的计算可以看出,分类系数越趋近于1,聚类效果越好。
4 关于模糊因子(隶属度的指数):本次计算中隶属度取2,因为在计算新的隶属度时,公式中有一个2/(q-1)的指数,因此q不能取1。
5 在算法过程中取得的让迭代停止的精度:如果精度取的比较小,如1e-5,在算出来的算法精度和聚类中心点矩阵中看不出明显变化,于是我把它改成了较大的精度(1e-2),虽然算法精度每一次还是看起来相同,(可能因为相差较小而没有显示出来)但是通过观察聚类中心点矩阵可以看出每一次迭代出的结果不同。

K-means算法与模糊C-means算法比较

K-means算法:它是一种“硬划分”,它把每个待辨识的对象严格地划分到某个类中,具有非此即彼的性质。
算法快速、简单; 对大数据集有较高的效率并且是可伸缩性的;时间复杂度近于线性,而且适合挖掘大规模数据集。在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的,因此事先并不知道给定的数据集应该分成多少个类别才最合适。在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化,若初始值选择的不好,可能无法得到有效的聚类结果。从运行结果来看,可以看出每一次的算法精度有较大的区别。该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是比较非常大的。

模糊C-means算法:同一个数据并不单独属于一个分类,而是可以出现在中间。在这个例子中,隶属函数变得更加平滑,表明每个数据可能属于几个分类。
模糊聚类属于识别模式中的无监督学习,不需要训练样本,可以直接通过机器学习达到自动分类的目的。模糊C-means算法的隶属度为0-1中间的任意数,反映了数据点和类中心的实际关系。该算法得出的结果并不稳定,原因就是该算法对初始质心选取很敏感,随机选取质心可能会得到错误结果并且迭代次数也会变大。当数据样本集合较大并且特征数目较多时,算法的实时性不太好。

计算智能——K-means算法模糊Cmeans算法相关推荐

  1. K-means聚类算法和模糊C-means聚类算法

    K-means聚类算法和模糊C-means聚类算法 1.K-means聚类算法 K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数, ...

  2. kmeans改进 matlab,基于距离函数的改进k―means 算法

    摘要:聚类算法在自然科学和和社会科学中都有很普遍的应用,而K-means算法是聚类算法中经典的划分方法之一.但如果数据集内相邻的簇之间离散度相差较大,或者是属性分布区间相差较大,则算法的聚类效果十分有 ...

  3. 算法-聚类-K均值与模糊K均值:原理+python代码

    这篇文章是根据作业修改后得到的,个人感觉写的比较详细了.但还有许多不足,希望大家评论指出. K均值聚类与模糊K均值 1. 算法原理及流程 相关名词解释如表1. 表1-相关名词解释 1.1 K均值算法原 ...

  4. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  5. k means聚类算法_一文读懂K-means聚类算法

    1.引言 什么是聚类?我们通常说,机器学习任务可以分为两类,一类是监督学习,一类是无监督学习.监督学习:训练集有明确标签,监督学习就是寻找问题(又称输入.特征.自变量)与标签(又称输出.目标.因变量) ...

  6. 聚类算法 距离矩阵_模糊聚类算法

    模糊聚类算法 1.如何理解模糊聚类 事物间的界线,有些是明确的,有些则是模糊的.当聚类涉及到事物之间的模糊界线时,需要运用模糊聚类分析方法. 如何理解模糊聚类的"模糊"呢:假设有两 ...

  7. 运动模糊图像复原算法实现及应用

    MATLAB图像复原系统 概述 1.1选题背景 从历史上来看,数字图像处理研究有很大部分是在图像恢复方面进行的,包括对算法的研究和针对特定问题的图像处理程序的编写.数字图像处理中很多值得注意的成就就是 ...

  8. 模糊聚类算法(FCM)

    伴随着模糊集理论的形成.发展和深化,RusPini率先提出模糊划分的概念.以此为起点和基础,模糊聚类理论和方法迅速蓬勃发展起来.针对不同的应用,人们提出了很多模糊聚类算法,比较典型的有基于相似性关系和 ...

  9. 【毕设教程】FCM模糊聚类算法

    文章目录 0 前言 1 如何理解模糊聚类 2 模糊C-means聚类算法 3 FCM算法原理 4 Python FCM支持 4.1 安装相关库 4.2 skfuzzy.cmeans函数说明 4.3 代 ...

最新文章

  1. Flume原理初探:基本执行原理概述
  2. 使用 Android NDK 重用现有的 C 代码
  3. BEA-141281 unable to get file lock, will retry ...
  4. log4j添加日志一定记住在工程的web.xml文件下加一些内容
  5. 《深入剖析Tomcat》一2.2 应用程序 1
  6. 华为云大数据存储的冗余方式是三副本_华为OceanStor分布式存储,引领智能时代大数据创新...
  7. GA,RC,Alpha,Beta,Final等软件版本名词释义
  8. android os n9005,SM-N9005
  9. Linux软件安装为什么名字不一样
  10. mysql映射成hashmap_大厂面试必问!HashMap 怎样解决hash冲突?
  11. iOS开发--xcode快捷键
  12. 服务器iis的作用,IIS是什么 IIS服务组件有什么作用
  13. 数据治理--元数据--元数据的作用
  14. OpenWrt路由器WIFI开启13信道
  15. h5调用手机相册摄像头以及文件夹
  16. datamodeler mysql_Navicat Data Modeler功能简介
  17. 黑盒测试五大测试阶段
  18. 绿幕背景视频抠图替换
  19. 【大白话学习】UniApp 微信小程序与APP应用 开发零基础入门教程(二)---登陆界面功能实现
  20. FME基础入门学习(四)

热门文章

  1. windows 登陆 和 pGina
  2. 【Linux】批量修改文件名
  3. php中怎么输出制表位,word如何使用制表位 word制表位的使用方法
  4. TRACE32——SMP多核调试
  5. 基于汇编语言的音乐盒设计与实现
  6. 02-lao-JavaScript基础
  7. Outlook 2003新建邮件多了个“发件人”栏
  8. Vue 视频截取第一帧图片-组件
  9. 基于s3c2450 s5k5ca camera移植
  10. 真无线蓝牙耳机哪款好?千元真无线蓝牙耳机推荐