模糊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.mzph.cn/news/127857.shtml

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

相关文章

1111 Online Map(30分)

题目翻译&#xff1a; 就是求解一个点到另一个点的最短路径。 不过由于限制条件很多&#xff0c;还得分开求两次&#xff0c;所以写起来就很繁。 题解思路&#xff1a; 可以用dijkstra或者dfs&#xff0c;用后者的话最后一个测试点可能会超时。 代码&#xff1a; dfs&…

Vins-Fusion、Vins-Mono(之前那个编译通过但是没有这个好用)

ROS的catkin_make不要修改,暂时没有理由&#xff0c;理由就是两次一个改了一个没改&#xff0c;没改的成功了以成功为准。 另外docker也没用成功&#xff0c;原本的逻辑来说&#xff0c;docker肯定不能出问题的&#xff0c;但是由于roscore通信的原因可能没有将结果显示&#x…

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

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

Spring Cloud Gateway 重写 URL

目录 1、简介 2、Spring Cloud Gateway 快速回顾 3、基于配置的 URL 重写 4、基于 DSL 的 URL 重写 5、测试 6、总结 1、简介 Spring Cloud Gateway 的常见用例是作为一个网关&#xff0c;代理一个或多个服务&#xff0c;从而为客户端提供更简单的消费方式。 本文将带你…

数学+分类讨论+构造:1102T3

http://cplusoj.com/d/senior/p/SS231102C 首先可以通过枚举逆序对点的贡献推出无解情况为 n m o d 4 > 1 n \bmod 4 > 1 nmod4>1 然后构造可以按 n m o d 3 n\bmod 3 nmod3 进行分类 #include<bits/stdc.h> using namespace std; #ifdef LOCAL#define deb…

Linux的test测试功能

测试文件名的类型&#xff0c;文件是否存在&#xff0c; 文件的权限检测 文件之间的比较 两个整数之间的比较 判断字符串数据 多重条件判定 一个一个来&#xff0c;这个有点多&#xff0c;不过比较有意思&#xff0c;来代码 案例1&#xff0c;判断文件是否存在&#xff…

超声波俱乐部分享:百度世界大会点燃AI创业者新希望

10月22日&#xff0c;2023年第十三期超声波俱乐部内部分享会在北京望京举行。本期的主题是&#xff1a;百度世界大会点燃AI创业者新希望。 到场的嘉宾有&#xff1a;超声波创始人杨子超&#xff0c;超声波联合创始人、和牛商业创始人刘思雨&#xff0c;中国国际经济交流中心研…

excel利用正则匹配和替换指定内容

上班中, 突然接到电话, 屋里的上司大人发来个excel, 说要替换里面x-x-xxx列的内容为x栋x单元xxx. 大致表格如下, 原表格我就不发了 身为程序猿的我, 肯定第一就想到了 正则! 打开excel-开始-查找和替换, 我擦, 只能完全匹配和替换 比如一次只能替换1-1- -> 为1栋1单元 1-2…

Java 零碎知识点

目录 [多线程]创建多线程的三种方式 [网络编程]一、重点概念1、TCP/IP网络模型2、IP 对象3、端口号4、协议UDP(User Datagram Protocol)TCP(Transmission Control Protocol) 二、UDP 通信三、TCP 通信 [前端][Vue]一、Vue3项目创建响应式函数父子通信父传子子传父 跨层组件通信…

Java规则引擎2.1.8版本新增功能说明

规则引擎更新功能 新增: 1.决策结束节点新增结果导出excel功能&#xff1b; 在决策流程的结束节点&#xff0c;可以将决策结果导出为Excel文件。这个功能为用户提供了更多的灵活性和便利性&#xff0c;使他们能够轻松地将决策结果数据进行进一步的分析和处理。 2.新增公有变…

@所有人,城市燃气信息化与信息安全建设方法

关键词&#xff1a;城市燃气信息化、智慧燃气建设、城市燃气安全、智慧燃气、智慧燃气平台 近几年&#xff0c;燃气作为一种新兴的燃料迅速普及开来&#xff0c;和燃气有关的企业之间的竞争也不可避免。身处在互联网的时代&#xff0c;企业只有顺应时代的潮流&#xff0c;将城…

代码最佳实践和指南(四)

错误处理和测试 错误处理和测试的重要性 测试你的代码是必要的&#xff0c;以确保你的代码正在做你认为它应该做的事情。尝试用小的、虚构的数据集测试你的代码&#xff0c;在那里你知道结果应该是什么&#xff0c;并检查你的程序是否给出了预期的答案。如果你有时间和资源&a…

SpringBoot 继承 Apollo 应用 简单步骤记录

1、pom.xml 添加依赖&#xff1b; <!--本地项目涉及到该sdk版本冲突时可能需要手动解决版本控制问题--><dependency><groupId>com.ctrip.framework.apollo</groupId><artifactId>apollo-client-tair</artifactId><version>1.4.0<…

概念解析 | 神经网络中的位置编码(Positional Encoding)

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…

通过xshell传输文件到服务器

一、user is not in the sudoers file. This incident will be reported. 参考链接&#xff1a; [已解决]user is not in the sudoers file. This incident will be reported.(简单不容易出错的方式)-CSDN博客 简单解释下就是&#xff1a; 0、你的root需要设置好密码 sudo …

Java实验二类编程实验

1.编写一个代表三角形的类&#xff08;Triangle.java&#xff09;。 其中&#xff0c;三条边a,b,c&#xff08;数据类型为double类型&#xff09;为三角形的属性&#xff0c;该类封装有求三角形的面积和周长的方法。分别针对三条边为3、4、5和7、8、9的两个三角形进行测试&…

Web Woeker和Shared Worker的使用以及案例

文章目录 1、前言2、介绍 Web Worker3、使用须知及兼容性3.1、使用须知3.2、兼容性 4、使用 Web Worker4.1、创建 Web Worker4.2、与主线程通信4.3、终止 Web Worker4.4、监听错误信息 5、使用 Shared Worker4.5、调试 Shared Worker 6、使用中的一些坑6.1、Web Woeker 中引入了…

古老的五子棋

午休忽然想起我奶奶喜欢下的一种古老的五子棋游戏&#xff0c;于是花了半小时开发出来了&#xff5e; 源代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" …

怎么监控钉钉聊天记录内容(监控钉钉聊天记录的3种形式)

企业沟通工具的普及&#xff0c;越来越多的企业开始使用钉钉作为内部沟通工具。然而&#xff0c;对于企业管理者来说&#xff0c;如何监控钉钉聊天记录内容成为了一个重要的问题。本文将介绍几种方法&#xff0c;帮助企业管理者实现监控钉钉聊天记录内容的目的。 一、钉钉自带功…

电商api数据采集分析(淘宝价格监控)

一、什么是淘宝商品数据采集&#xff1f; 淘宝商品数据采集&#xff0c;顾名思义&#xff0c;就是通过技术手段对全网电商平台上的商品价格信息进行抓取并保存。通过将收集到的这些价格信息进行分析处理后得到该商品的成交价、折扣率等关键属性指标&#xff0c;从而为卖家提供参…