# python3模糊C均值聚类算法,数据集为iris,放在和代码同一目录即可。算法原理及步骤参考:https://wenku.baidu.com/view/ee968c00eff9aef8941e06a2.html
import copy
import math
import random
import time
import sys
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import decimal# 用于初始化隶属度矩阵U
global MAX
MAX = 10000.0
# 用于结束条件
global Epsilon
Epsilon = 0.00000001def import_data_format_iris(file):""" 格式化数据,前四列为data,最后一列为cluster_location数据地址 http://archive.ics.uci.edu/ml/machine-learning-databases/iris/"""data = []cluster_location =[]with open(str(file), 'r') as f:for line in f:current = line.strip().split(",")current_dummy = []for j in range(0, len(current)-1):current_dummy.append(float(current[j]))j += 1 if  current[j] == "Iris-setosa\n":cluster_location.append(0)elif current[j] == "Iris-versicolor\n":cluster_location.append(1)else:cluster_location.append(2)data.append(current_dummy)print ("加载数据完毕")return data , cluster_locationdef randomise_data(data):"""该功能将数据随机化,并保持随机化顺序的记录"""order = list(range(0, len(data)))random.shuffle(order)new_data = [[] for i in range(0, len(data))]for index in range(0, len(order)):new_data[index] = data[order[index]]return new_data, orderdef de_randomise_data(data, order):"""此函数将返回数据的原始顺序,将randomise_data()返回的order列表作为参数"""new_data = [[]for i in range(0, len(data))]for index in range(len(order)):new_data[order[index]] = data[index]return new_datadef print_matrix(list):""" 以可重复的方式打印矩阵"""for i in range(0, len(list)):print (list[i])def initialise_U(data, cluster_number):"""这个函数是隶属度矩阵U的每行加起来都为1. 此处需要一个全局变量MAX."""global MAXU = []for i in range(0, len(data)):current = []rand_sum = 0.0for j in range(0, cluster_number):dummy = random.randint(1,int(MAX))current.append(dummy)rand_sum += dummyfor j in range(0, cluster_number):current[j] = current[j] / rand_sumU.append(current)return Udef distance(point, center):"""该函数计算2点之间的距离(作为列表)。我们指欧几里德距离。        闵可夫斯基距离"""if len(point) != len(center):return -1dummy = 0.0for i in range(0, len(point)):dummy += abs(point[i] - center[i]) ** 2return math.sqrt(dummy)def end_conditon(U, U_old):"""结束条件。当U矩阵随着连续迭代停止变化时,触发结束"""global Epsilonfor i in range(0, len(U)):for j in range(0, len(U[0])):if abs(U[i][j] - U_old[i][j]) > Epsilon :return Falsereturn Truedef normalise_U(U):"""在聚类结束时使U模糊化。每个样本的隶属度最大的为1,其余为0"""for i in range(0, len(U)):maximum = max(U[i])for j in range(0, len(U[0])):if U[i][j] != maximum:U[i][j] = 0else:U[i][j] = 1return U# m的最佳取值范围为[1.5,2.5]
def fuzzy(data, cluster_number, m):"""这是主函数,它将计算所需的聚类中心,并返回最终的归一化隶属矩阵U.参数是:簇数(cluster_number)和隶属度的因子(m)"""# 初始化隶属度矩阵UU = initialise_U(data, cluster_number)# print_matrix(U)# 循环更新Uwhile (True):# 创建它的副本,以检查结束条件U_old = copy.deepcopy(U)# 计算聚类中心C = []for j in range(0, cluster_number):current_cluster_center = []for i in range(0, len(data[0])):dummy_sum_num = 0.0dummy_sum_dum = 0.0for k in range(0, len(data)):# 分子dummy_sum_num += (U[k][j] ** m) * data[k][i]# 分母dummy_sum_dum += (U[k][j] ** m)# 第i列的聚类中心current_cluster_center.append(dummy_sum_num/dummy_sum_dum)# 第j簇的所有聚类中心C.append(current_cluster_center)# 创建一个距离向量, 用于计算U矩阵。distance_matrix =[]for i in range(0, len(data)):current = []for j in range(0, cluster_number):current.append(distance(data[i], C[j]))distance_matrix.append(current)# 更新Ufor j in range(0, cluster_number):  for i in range(0, len(data)):dummy = 0.0for k in range(0, cluster_number):# 分母dummy += (distance_matrix[i][j ] / distance_matrix[i][k]) ** (2/(m-1))U[i][j] = 1 / dummyif end_conditon(U, U_old):print ("结束聚类")breakprint ("标准化 U")U = normalise_U(U)return Udef checker_iris(final_location):"""和真实的聚类结果进行校验比对"""right = 0.0for k in range(0, 3):checker =[0,0,0]for i in range(0, 50):for j in range(0, len(final_location[0])):if final_location[i + (50*k)][j] == 1:checker[j] += 1right += max(checker)print (right)answer =  right / 150 * 100return "准确度:" + str(answer) +  "%"if __name__ == '__main__':# 加载数据data, cluster_location = import_data_format_iris("iris.txt")# print_matrix(data)# 随机化数据data , order = randomise_data(data)# print_matrix(data)start = time.time()# 现在我们有一个名为data的列表,它只是数字# 我们还有另一个名为cluster_location的列表,它给出了正确的聚类结果位置# 调用模糊C均值函数final_location = fuzzy(data , 2 , 2)# 还原数据final_location = de_randomise_data(final_location, order)# print_matrix(final_location)# 准确度分析print (checker_iris(final_location))print ("用时:{0}".format(time.time() - start))

python实现 模糊C均值聚类算法(Fuzzy-C-Means)-基于iris数据集相关推荐

  1. 模糊C均值聚类(Fuzzy C-means)算法(FCM)

    一.FCM算法简介 1.模糊集理论 L.A.Zadeh在1965年最早提出模糊集理论,在该理论中,针对传统的硬聚类算法其隶属度值非0即1的严格隶属关系,使用模糊集合理论,将原隶属度扩展为 0 到 1 ...

  2. 浅谈模糊C均值聚类(Fuzzy C-means Clustering)

    浅谈模糊C均值聚类(Fuzzy C-means Clustering) 定义:模糊c-均值聚类算法 fuzzy c-means algorithm (FCMA)或称( FCM).在众多模糊聚类算法中, ...

  3. python计算iris数据集的均值_模糊C均值聚类算法及python实现

    目录 本文采用数据集为iris,将iris.txt放在程序的同一文件夹下.请先自行下载好. 模糊理论 模糊控制是自动化控制领域的一项经典方法.其原理则是模糊数学.模糊逻辑.1965,L. A. Zad ...

  4. php fuzzy,模糊C均值聚类算法(Fuzzy C-means)

    模糊c均值聚类与k均值聚类区别 k均值聚类 k均值聚类的实现中,把每个样本划分到单一的类别中,亦即是每个样本只能属于一种类别,不能属于多种类别.这样的划分,称为硬划分. 模糊c均值均类 为了解决硬划分 ...

  5. 灰狼算法 c语言 代码,基于灰狼优化的模糊C—均值聚类算法

    谢亮亮+刘建生+朱凡 摘要:针对模糊C-均值聚类算法(FCM)存在易受初始聚类中心影响和容易陷入局部最优的问题,提出了一种将灰狼优化算法(GWO)和模糊C-均值相结合的新聚类算法(GWO-FCM).该 ...

  6. 具有自适应空间强度约束和隶属度链接的鲁棒模糊c均值聚类算法

    a b s t r a c t 实践证明,模糊C均值聚类方法是一种有效的图像分割方法.然而,对于噪声图像,FCM方法并不稳健且不太精确.提出了一种改进的FCM方法--FCM _ SICM法,用于噪声图 ...

  7. 【图像分割】基于局部信息的模糊C均值聚类算法(FLICM)实现图像分割matlab代码

    1 简介 以图像分割为研究内容,分析了图像的空频域特征,并在此基础之上提出了一种基于模糊局部信息C均值聚类的分割算法.由于FLICM算法充分利用局部空间信息和局部灰度信息,能够很好地描述模糊性,对于边 ...

  8. FCM 模糊C均值聚类算法

    首先FCM在图像分割领域有很多应用,FCM算法我觉得主要是两个部分,一个是模糊理论,一个是C/Kmean算法,这两者在数学家手中完美的结合. 下面切入整体,我也是为了温故才写的这篇博客,如有错误或者瑕 ...

  9. 模糊 C 均值聚类(Fuzzy C-Means)

    文章目录 原理 安装 skfuzzy 函数参数 返回值 注意事项 实战 数据生成 FCM 聚类 结果分析 代价函数下降过程 隶属度与聚类中心的关系 求聚类中心的高斯核半径 为什么要用隶属度的m次方加权 ...

  10. 基于FCM模糊C均值聚类算法的MATLAB仿真

    目录 1.算法仿真效果 2.MATLAB源码 3.算法概述 4.部分参考文献 1.算法仿真效果 matlab2022a仿真结果如下: 2.MATLAB源码 %*********************

最新文章

  1. Pure-FTPd服务器
  2. 如果有一天程序员再也不忙了
  3. 蛋壳公寓再获5亿美元C轮融资,老虎环球基金、蚂蚁金服联合领投
  4. arm linux应用调用rtc接口,ARMLinux驱动RTC(实时时钟)驱动分析
  5. swift5导航栏标题文字属性设置
  6. lisp中怎样调取图形_CAD的lisp程序已加载,怎样绘图?
  7. yii2 刷新缓存(刷新模型缓存)
  8. 3个框框带你理解EventLoop
  9. 八年级计算机模拟试题,八年级计算机试卷(含答案).doc
  10. 设计模式学习(四)工厂模式
  11. 在线HTTP POST/GET接口测试工具
  12. 拼音搜索函数(C# and java)
  13. 用spss进行数据的标准化处理_SPSS统计分析案例:数据标准化
  14. 怎么看cpu的好坏 图文告诉你电脑cpu怎么看
  15. 转:YY淘宝商品数据库设计
  16. 机器学习基础教程——最小二乘法案列
  17. Elasticsearch:深入理解 Dissect ingest processor
  18. java里 输出101-150中的素数
  19. 有没有html做的平安夜页面或者圣诞节,送给同学的平安夜圣诞节祝福语
  20. [转]百度UEditor编辑器(php)

热门文章

  1. CH2-Java编程基础(7个案例实现)
  2. PLC远程控制的方案
  3. 科学表明世界上最令人感觉舒服的10种颜色(色码及RGB)
  4. zabbix-agent key属性列表
  5. 通信接口——RS-232与RS-422及RS-485三者之间的特性与区别
  6. idea设置修改字体大小与样式【亲测好用】
  7. matlab 信号去直流,Speex中的近端信号去直流和预加重操作
  8. 数控铣床法兰克系统代码完整版
  9. matlab符号函数绘图法_MATLAB符号运算实验
  10. 按键消抖的Verilog实现