模糊C均值聚类(FCM)python

目录

一、模糊C均值聚类的原理 

二、不使用skfuzzy的python代码

三、 使用skfuzzy的python代码


一、模糊C均值聚类的原理 

 

二、不使用skfuzzy的python代码

import numpy as np
import random
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False'''初始化隶属矩阵'''
def initial_u0(n,K):''':param n:样本数量:param K:簇的数量:return: 初始化的隶属矩阵'''u0=np.zeros((K,n))for i in range(K):for j in range(n):if i==0:u0[i][j]=random.uniform(0,1)elif i<K-1:s=0for k in range(i):s=s+u0[k][j]u0[i][j]=random.uniform(0,1-s)else:s=0for k in range(i):s=s+u0[k][j]u0[i][j]=1-sreturn u0'''聚类函数'''
def Cluster(U,n):''':param U:隶属度矩阵:param n: 样本数量:return: 聚类结果'''cluster=[]for i in range(n):A=U.T[i].tolist()a=A.index(max(A))cluster.append(int(a))return cluster'''计算隶属中心矩阵'''
def center(data,U,m,n,K,dim):''':param data:样本数据:param U: 隶属度矩阵:param m: 模糊加权参数,一般取2:param n: 样本数量:param K: 聚类数目:param dim: 维度:return: 隶属中心矩阵''''''进行初始聚类'''cluster=Cluster(U,n)'''初始化隶属中心矩阵'''Z=np.zeros((K,dim))'''计算隶属中心矩阵'''#初始化u_x=[np.zeros((1,dim)) for i in range(K)]u=[0 for i in range(K)]#计算for i in range(n):c=cluster[i]  #类别u[c]=u[c]+(U[c][i])**mu_x[c]=u_x[c]+((U[c][i])**m)*data[i]for i in range(K):Z[i]=u_x[i]/u[i]'''返回隶属中心矩阵'''return Z'''基于欧氏距离计算各点到聚类中心的距离矩阵'''
def distinct(data,n,dim,Z,K):''':param data:样本数据:param n: 样本数量:param dim: 数据维度:param Z: 隶属中心矩阵:param K: 聚类数目:return: 基于欧氏距离的距离矩阵''''''初始化距离矩阵'''D=np.zeros((K,n))'''计算欧式距离'''for i in range(K):for j in range(n):z=Z[i]   #隶属中心df=data[j]  #数据点df_z=df-zd=0for k in range(dim):d=d+(df_z[k])**2d=np.sqrt(d)D[i][j]=d'''返回距离矩阵'''return D'''定义目标函数并返回目标函数值'''
def function(data,Z,n,dim,K,U,m,D):''':param data:样本数据:param Z: 隶属中心矩阵:param n: 样本数量:param dim: 数据维度:param K: 聚类数目:param U: 隶属度矩阵:param m: 模糊加权参数:param D: 距离矩阵:return: 目标函数值''''''初始化聚类'''cluster=Cluster(U,n)'''计算目标函数值'''J=0    #目标函数值W=[0 for i in range(K)]for i in range(n):c=cluster[i]  #聚类类别df=data[i]    #数据点z=Z[c]        #聚类中心d=D[c][i]     #数据点到聚类中心的距离u=U[c][i]     #隶属度W[c]=W[c]+(u**m)*(d**2)J=sum(W)'''返回目标函数值'''return J'''更新隶属度矩阵'''
def update_U(data,Z,n,dim,K,D,m):''':param data:样本数据:param Z: 隶属中心矩阵:param n: 样本数量:param dim: 数据维度:param K: 聚类数目:param D: 距离矩阵:param m: 模糊加权参数:return: 更新后的隶属度矩阵''''''初始化隶属度矩阵'''U=np.zeros((K,n))'''更新隶属度矩阵'''for i in range(K):for j in range(n):r=0for k in range(K):r=r+(D[i][j]/D[k][j])**(2/(m-1))U[i][j]=1/r'''返回更新后的隶属度矩阵'''return U'''模糊C均值聚类函数'''
def FCM(data,K,Tmax,m,error):''':param data:样本数据:param K: 聚类数目:param Tmax: 最大迭代步数:param m: 模糊加权参数:param error: 迭代停止阈值,一般取0.001至0.01:return: 聚类结果''''''样本数量'''n=data.shape[0]'''数据维度'''dim=data.shape[1]'''初始化隶属度矩阵'''U0=initial_u0(n,K)U=U0.copy()'''存储目标函数值'''J=[]'''循环'''for i in range(Tmax):#计算隶属中心矩阵Z=center(data,U,m,n,K,dim)#基于欧氏距离计算各点到聚类中心的距离矩阵D=distinct(data,n,dim,Z,K)#计算目标函数的值J.append(function(data,Z,n,dim,K,U,m,D))#更新隶属度矩阵U=update_U(data,Z,n,dim,K,D,m)#判断阈值if i!=0 and abs(J[i-1]-J[i])<=error:break'''得到聚类结果'''cluster=Cluster(U,n)'''返回聚类结果(聚类类别,聚类中心,目标函数值)'''return cluster,Z,J[-1]'''主函数'''
if __name__=="__main__":'''随机产生400组在区间[0,1]上的二维数据'''data=np.array([[random.uniform(0, 1) for i in range(2)] for j in range(400)])'''聚类'''cluster,cntr,J=FCM(data,K=4,Tmax=1000,m=2,error=0.0001)print("聚类结果:\n{}".format(cluster))print("目标函数值:\n{}".format(J))#将数据分类fdata=data.tolist()X1=[]Y1=[]X2=[]Y2=[]X3=[]Y3=[]X4=[]Y4=[]for i in range(400):if cluster[i]==0:X1.append(fdata[i][0])Y1.append(fdata[i][1])if cluster[i]==1:X2.append(fdata[i][0])Y2.append(fdata[i][1])if cluster[i]==2:X3.append(fdata[i][0])Y3.append(fdata[i][1])if cluster[i]==3:X4.append(fdata[i][0])Y4.append(fdata[i][1])# 聚类图plt.scatter(X1, Y1, c='red', marker='o')plt.scatter([cntr[0][0]], [cntr[0][1]], marker='>', c="black", label='聚类中心1')plt.scatter(X2, Y2, c='blue', marker="o")plt.scatter([cntr[1][0]], [cntr[1][1]], marker='<', c="black", label="聚类中心2")plt.scatter(X3, Y3, c='green', marker="o")plt.scatter([cntr[2][0]], [cntr[2][1]], marker='^', c="black", label="聚类中心3")plt.scatter(X4, Y4, c='orange', marker="o")plt.scatter([cntr[3][0]], [cntr[3][1]], marker="D", c="black", label="聚类中心4")plt.legend()plt.xlabel("x")plt.ylabel("y")plt.title("聚类图")plt.show()

三、 使用skfuzzy的python代码

import numpy as np
import random
import skfuzzy as fuzz
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False'''随机产生400组在区间[0,1]上的二维数据'''
data = np.array([[random.uniform(0,1) for i in range(2)] for j in range(400)])'''初始化隶属度矩阵(聚成4类)'''
'''
cntr:聚类中心
u:最后的隶属度矩阵
u0:初始化的隶属度矩阵
d:是一个矩阵,记录每一个点到聚类中心的欧式距离
jm:是目标函数的优化历史
p:p是迭代的次数
fpc:全称是fuzzy partition coefficient, 是一个评价分类好坏的指标,它的范围是0到1, 1表示效果最好,后面可以通过它来选择聚类的个数。
'''
cntr, u, u0, d, jm, p, fpc = fuzz.cluster.cmeans(data.T, 4, 2, error=0.0001, maxiter=1000)'''迭代计算'''
cntr, u, u0, d, jm, p, fpc = fuzz.cluster.cmeans(data.T, 4,2, error=0.0001, maxiter=1000)'''获得聚类结果'''
cluster_membership = np.argmax(u, axis=0)'''绘制聚类结果'''
#将数据分类
fdata=data.tolist()
X1=[]
Y1=[]
X2=[]
Y2=[]
X3=[]
Y3=[]
X4=[]
Y4=[]
for i in range(400):if cluster_membership[i]==0:X1.append(fdata[i][0])Y1.append(fdata[i][1])if cluster_membership[i]==1:X2.append(fdata[i][0])Y2.append(fdata[i][1])if cluster_membership[i]==2:X3.append(fdata[i][0])Y3.append(fdata[i][1])if cluster_membership[i]==3:X4.append(fdata[i][0])Y4.append(fdata[i][1])#聚类图
plt.scatter(X1,Y1,c='red',marker='o')
plt.scatter([cntr[0][0]],[cntr[0][1]],marker='>',c="black",label='聚类中心1')
plt.scatter(X2,Y2,c='blue',marker="o")
plt.scatter([cntr[1][0]],[cntr[1][1]],marker='<',c="black",label="聚类中心2")
plt.scatter(X3,Y3,c='green',marker="o")
plt.scatter([cntr[2][0]],[cntr[2][1]],marker='^',c="black",label="聚类中心3")
plt.scatter(X4,Y4,c='orange',marker="o")
plt.scatter([cntr[3][0]],[cntr[3][1]],marker="D",c="black",label="聚类中心4")
plt.legend()
plt.xlabel("x")
plt.ylabel("y")
plt.title("聚类图")
plt.show()print(cluster_membership)
'''
print("cntr:\n{}".format(cntr))
print("u:\n{}".format(u))
print("u0:\n{}".format(u0))
print("d:\n{}".format(d))
print("jm:\n{}".format(jm))
print("p:\n{}".format(p))
print("fpc:\n{}".format(fpc))
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/177027.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关&#xff0c;手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么&#xff0c;以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析&#xff0c;打破面试难关 防止消息丢失与消息重复——Kafka可…

【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件

文章目录 1.ProgressBar2. ImageList3.ListView控件 1.ProgressBar 用于显示某个操作的进度。 属性&#xff1a; Value: 表示当前进度条的值&#xff0c;其范围由Min和Max决定。Step: 设置每次调用PerformStep()方法时增加的步长。MarqueeAnimationSpeed: 在Style设置为Marq…

二叉树问题——前/中/后/层遍历问题(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 103. 二叉树的锯齿形层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前…

MySQL连接的原理⭐️4种优化连接的手段性能提升240%

MySQL连接的原理⭐️4种优化连接的手段性能提升240%&#x1f680; 前言 上两篇文章我们说到MySQL优化回表的三种方式&#xff1a;索引条件下推ICP、多范围读取MRR与覆盖索引 MySQL的优化利器⭐️索引条件下推&#xff0c;千万数据下性能提升273%&#x1f680; MySQL的优化…

黄金矿工小游戏

欢迎来到程序小院 黄金矿工 玩法&#xff1a;点击开始游戏&#xff0c;黄金和钩子&#xff0c;钩子会左右摆动&#xff0c;对准黄金位置点击鼠标左键钓起黄金加对应时间&#xff0c;钓起黑色四块减去响应时间&#xff0c;快去挖矿吧^^。开始游戏https://www.ormcc.com/play/ga…

主播直播美颜SDK:提升颜值的秘诀

当下&#xff0c;主播们往往依赖于主播直播美颜SDK&#xff0c;这个技术工具为他们提供了一个让自己看起来更好看的机会。本文将深入探讨主播直播美颜SDK的工作原理、应用和影响&#xff0c;揭示提升颜值的秘诀。 一、主播直播美颜SDK是什么&#xff1f; 主播直播美颜SDK是一…

Latex排版SIGGRAPH总结(持续总结中...)

本文学习总结自&#xff1a;How to use the ACM SIGGRAPH / TOG LaTeX template 相关文件&#xff1a;百度网盘 首先解压 “my paper” 中的文件&#xff0c;并用Latex打开mypaper.tex. 多行连等公式 \begin{equation}表示编号公式&#xff0c;\[ \]表示无编号公式 无编号\b…

JMeter:断言之响应断言

一、断言的定义 断言用于验证取样器请求或对应的响应数据是否返回了期望的结果。可以是看成验证测试是否预期的方法。 对于接口测试来说&#xff0c;就是测试Request/Response&#xff0c;断言即可以针对Request进行&#xff0c;也可以针对Response进行。但大部分是对Respons…

精益制造的工具与方法有什么区别?ECRS工时分析软件的功能和价值

精益制造是一套价值创造系统&#xff0c;它强调在生产过程中减少浪费、提高效率和质量&#xff0c;从而实现持续改进和优化。在精益制造的理念下&#xff0c;企业需要运用一系列的工具和方法来提升生产管理水平。这些工具和方法不仅包括传统的精益工具&#xff0c;如5S、持续改…

三.RocketMQ单机安装及集群搭建

RocketMQ单机安装及集群搭建 一&#xff1a;安装环境1.软硬件要求2.下载RocketMQ 二.安装单机MQ1.上传并解压2.目录介绍3.修改MQ启动时初始JVM内存4.启动NameServer与Broker5.测试RocketMQ 三.RocketMQ集群搭建1.集群概念特点2.集群模式分类3.集群工作流程4.双主双从集群搭建4.…

X64(64位)汇编指令与机器码转换原理

X64&#xff08;64位&#xff09;汇编指令与机器码转换原理 1 64位寻址形式下的ModR/M字节1.1 寻址方式1.2 寄存器编号 2 汇编指令转机器码2.1 mov rcx, 1122334455667788h2.2 mov rcx,[r8]与mov [r8],rcx2.3 mov rcx,[r8r9*2] 本文属于《 X86指令基础系列教程》之一&#xff…

Uniapp开发的开源盲盒系统源码

最近比较火的盲盒系统&#xff0c;该项目是基于uniapp开发的盲盒项目&#xff0c;有需要的朋友可以联系我&#xff0c;运营级的项目&#xff0c;本次开源的是uniapp前端模板&#xff0c;选用技术为JAVA&#xff0c;采用框架&#xff1a;spring bootmybatisvue开发。 通过node安…

Javassist讲解1(介绍,读写字节码)

Javassist讲解1&#xff08;介绍&#xff0c;读写字节码&#xff09; 介绍一、读写字节码1.如何创建新的类2.类冻结 介绍 javassist 使Java字节码操作变得简单&#xff0c;它是一个用于在Java中编辑字节码的类库&#xff1b; 它使Java程序能够在运行时定义一个新类&#xff0c;…

6-3 求二叉树的高度 分数 10

int Depth(BiTree Tree) {if (!Tree)return 0;return Depth(Tree->lchild) > Depth(Tree->rchild) ? Depth(Tree->lchild) 1 : Depth(Tree->rchild) 1; }

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件&#xff1a;上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振&#xff0c; 49_999_999 是 1秒…

apk反编译修改教程系列---简单去除apk联网权限 其他权限 无法自动更新等【四】

往期教程&#xff1a; apk反编译修改教程系列-----修改apk应用名称 任意修改名称 签名【一】 apk反编译修改教程系列-----任意修改apk版本号 版本名 防止自动更新【二】 apk反编译修改教程系列-----修改apk中的图片 任意更换apk桌面图片【三】 目前基本所有的apk都有联网设…

Zynq UltraScale+ XCZU5EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 MIPI 编解码方案3、本 MIPI CSI2 模块性能及其优越性4、详细设计方案设计原理框图IMX214 摄像头及其配置D-PHY 模块CSI-2-RX 模块Bayer转RGB模块伽马矫正模块VDMA图像缓存Video Scaler 图像缓存DP 输出 5、vivado工程详解PL端FPGA硬件设计…

分布式消息队列:Rabbitmq(2)

目录 一:交换机 1:Direct交换机 1.1生产者端代码: 1.2:消费者端代码: 2:Topic主题交换机 2.1:生产者代码: 2.2:消费者代码: 二:核心特性 2.1:消息过期机制 2.1.1:给队列中的全部消息指定过期时间 2.1.2:给某条消息指定过期时间 2.2:死信队列 一:交换机 1:Direct交…

macOS 创建Flutter项目

参考在 macOS 上安装和配置 Flutter 开发环境 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 这个文档&#xff0c;配置好flutter的环境 编辑器可以选择vscode或者IDEA。 我这里以IDEA为例 打开 IDE 并选中 New Flutter Project。 选择 Flutter&#xff0c;验证 F…

云游长江大桥,3DCAT实时云渲染助力打造沉浸化数字文旅平台

南京长江大桥是中国第一座自主设计建造的双层公路铁路桥&#xff0c;也是世界上最早的双层公路铁路桥之一。它不仅是一座桥梁&#xff0c;更是一座历史文化的见证者和传承者。它见证了中国人民的智慧和奋斗&#xff0c;承载了中国社会的变迁和发展。 如何让这座不可移动的文物…