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

模糊c均值聚类与k均值聚类区别

k均值聚类

k均值聚类的实现中,把每个样本划分到单一的类别中,亦即是每个样本只能属于一种类别,不能属于多种类别。这样的划分,称为硬划分。

模糊c均值均类

为了解决硬划分所带来的问题,因此有了称为软划分的聚类算法,这一类算法中,每个样本不再只能属于一种类别,而是对于每个样本,都有对应的隶属度数组,数组里的每一个元素代表该样本属于某种类别的程度。而该样本的隶属度数组中的总值等于1。

其目标方程以及优化的推导过程可以参照下述链接,个人认为推导过程十分详细。

模糊c均值聚类推导

实现步骤:

根据相关的推导结果,具体实现步骤如下:

初始化数据集

初始化隶属度数组

根据隶属度数组更新聚类中心

根据聚类中心更新隶属度数组

是否达到结束条件,没有达到则重复2-4步骤。

实现

各个相关函数都有注释。

#include

#include

#include

#include

typedef struct{

double x;

double y;

} Position;

//随机生成二维数据点

//len:节点数量

//range:节点x、y值的范围

Position *randomPosition(int len, int range){

srand((unsigned)time(NULL));

Position *allPos = (Position *)malloc(len * sizeof(Position));

short a = 1; //人为差异量

for (int i = 0; i < len; ++i)

{

if (a)

{

allPos[i].x = (double)rand() / 2147483647 * range;

allPos[i].y = (double)rand() / 2147483647 * range;

a = 0;

}

else if (!a)

{

allPos[i].x = (double)rand() / 2147483647 * range+50;

allPos[i].y = (double)rand() / 2147483647 * range+50;

a = 1;

}

}

return allPos;

}

//fcm初始化:隶属度矩阵

//posNum:节点数量

//clusterNum:聚类中心数量

double **init(int posNum, int clusterNum){

double **u = (double **)malloc(sizeof(double *) * clusterNum);

for (int i = 0; i

{

u[i] = (double *)malloc(sizeof(double) * posNum);

}

srand((unsigned)time(NULL));

double sum;

//初始化u:sigmaU[i]=1

for (int i = 0; i < posNum; ++i)

{

sum=1;

for (int x = 0; x < clusterNum - 1; ++x)

{

u[x][i] = ((double)rand() / 2147483647) * sum;

sum -= u[x][i];

printf("u[%d][%d]:%f ",x,i,u[x][i]);

}

u[clusterNum-1][i]=sum;

printf("u[%d][%d]:%f\n",clusterNum-1,i,u[clusterNum-1][i]);

}

return u;

}

//输出所有数据点

//allPos:节点数组

//len:节点数量

void outputPos(Position *allPos, int len){

for (int i = 0; i < len; ++i)

printf("position %d:(%f,%f)\n", i, allPos[i].x, allPos[i].y);

return;

}

//所有隶属于聚类中心i的点的隶属程度和

//u:隶属度矩阵

//posNum:节点数量

//i:第i个聚类中心

//m:隶属度因子

double sumUi(double** u,int posNum,int i,int m){

double res=0;

for(int x=0;x

res+=pow(u[i][x],m);

return res;

}

//所有隶属于聚类中心i的点的x坐标的和

//u:隶属度矩阵

//allPos:节点数组

//posNum:节点数量

//i:第i个聚类中心

//m:隶属度因子

double sumXi(double** u,Position* allPos,int posNum,int i,int m){

double res=0;

for(int x=0;x

res+=allPos[x].x*pow(u[i][x],m);

return res;

}

//所有隶属于聚类中心i的点的y坐标的和

//u:隶属度矩阵

//posNum:节点数量

//i:第i个聚类中心

//m:隶属度因子

double sumYi(double** u,Position* allPos,int posNum,int i,int m){

double res=0;

for(int x=0;x

res+=allPos[x].y*pow(u[i][x],m);

return res;

}

//第j个节点到所有聚类中心距离总和

//pos:第j个节点

//cluster:聚类中心数组

//clusterNum:聚类中心数量

//m:隶属度因子

double sumDis(Position pos,Position* cluster,int clusterNum,int m){

double res=0;

for(int i=0;i

res+=(double)1/pow(pow(pos.x-cluster[i].x,2)+pow(pos.y-cluster[i].y,2),(double)1/(m-1));

return res;

}

//更新聚类中心

//allPos:节点数组

//cluster:聚类中心数组

//u:隶属度矩阵

//posNum:节点数量

//clusterNum:聚类中心数量

//m:隶属度因子

void updateCluster(Position* allPos,Position* cluster,double** u,int posNum,int clusterNum,int m){

for(int i=0;i

cluster[i].x=sumXi(u,allPos,posNum,i,m)/sumUi(u,posNum,i,m);

cluster[i].y=sumYi(u,allPos,posNum,i,m)/sumUi(u,posNum,i,m);

}

}

//更新隶属度矩阵

//allPos:节点数组

//cluster:聚类中心数组

//u:隶属度矩阵

//posNum:节点数量

//clusterNum:聚类中心数量

//m:隶属度因子

void updateU(Position* allPos,Position* cluster,double** u,int posNum,int clusterNum,int m){

double disXI;

for(int i=0;i

for(int x=0;x

disXI=pow(pow(allPos[x].x-cluster[i].x,2)+pow(allPos[x].y-cluster[i].y,2),(double)1/(m-1));

u[i][x]=(double)1/(disXI*sumDis(allPos[x],cluster,clusterNum,m));

}

}

//输出目标函数

//allPos:节点数组

//cluster:聚类中心数组

//u:隶属度矩阵

//posNum:节点数量

//clusterNum:聚类中心数量

//m:隶属度因子

void outpuCost_fun(Position* allPos,Position* cluster,double** u,int posNum,int clusterNum,int m){

double res=0;

for(int i=0;i

for(int x=0;x

res+=(pow(u[i][x],m)*(pow(allPos[x].x-cluster[i].x,2)+pow(allPos[x].y-cluster[i].y,2)));

printf("costFun:%f\n",res);

}

//..略,同上

void outputU(double** u,int posNum,int clusterNum){

for(int i=0;i

for(int x=0;x

printf("u[%d][%d]:%f ",x,i,u[x][i]);

printf("\n");

}

}

void fuzzy_Cmeans(int posNum,int clusterNum, int m, int iterTime,int range)

{

Position* allPos=randomPosition(posNum,range);

Position* cluster=(Position*)malloc(sizeof(Position)*clusterNum);

double** u=init(posNum,clusterNum);

for (int i = 0; i < iterTime; ++i)

{

updateCluster(allPos,cluster,u,posNum,clusterNum,m);

updateU(allPos,cluster,u,posNum,clusterNum,m);

outpuCost_fun(allPos,cluster,u,posNum,clusterNum,m);

//outputU(u,posNum,clusterNum);

}

}

int main(){

fuzzy_Cmeans(100,10,3,500,500);

return 0;

}

结果

可以看到,其目标函数的值是逐渐减少的,最后达到稳定的状态。

bV44Lg?w=431&h=457

bV44Lk?w=433&h=467

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

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

相关文章

dw新建php文件自动生成html,dw如何新建css规则

1、在菜单中单击“文件”选择“新建”2、在新建文档窗口&#xff0c;选择“空白页”—“HTML”&#xff0c;文档类型选择“XHTML1.0 transitional”,单击“创建”按钮3、将插入点放在文档中&#xff0c;然后在菜单栏单击“格式”&#xff0c;在弹出的下拉菜单中选择“CSS样式”…

oracle获取登录名,oracle如何获取当前登录的用户名

Microsoft Windows [版本 5.2.3790](C) 版权所有 1985-2003 Microsoft Corp.C:/>sqlplusSQL*Plus: Release 9.2.0.1.0 - Production on 星期三 5月 30 00:04:26 2007Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.请输入用户名: scott请输入口令:连…

python实现英文新闻摘要自动提取_Automotive Innovation摘要集系列2:Intelligent and Connected Vehicles...

为便于广大科技工作者更好的了解中国汽车行业首个英文学术期刊《Automotive Innovation》&#xff0c;并更快的定位到自己感兴趣的论文&#xff0c;编辑部把2018-2019年刊出的70篇论文摘要进行集结&#xff0c;并按照节能与环保(Energy-saving & Eco-systems)、智能网联汽车…

linux 改变文件夹属性,技术|在Linux中用chattr和lsattr命令管理文件和目录属性

为了允许添加数据&#xff0c;防止更改或者删除等&#xff0c;文件和文件夹可以设定了特定的控制属性。例如&#xff0c;你可以在关键的系统文件或者文件夹中启用属性&#xff0c;然后没有任何用户&#xff0c;包括root&#xff0c;可以删除或者修改它&#xff0c;比如不允许使…

linux 系统盘无法ls,系统故障排除

1.系统故障排除1)模拟磁盘/dev/sda的MBR故障&#xff0c;并执行修复01.备份磁盘/dev/sda的MBR扇区选择一个/dev/sda以外的文件系统(比如/dev/sdb1)来存放备份文件&#xff1a;[rootsvr5 ~]# df -hT/home//选择/dev/sdb1存放备份文件系统 类型 容量 已用 可…

docker公共存储库_查找并修复docker镜像安全漏洞

容器的出现使开发团队可以创建沙盒环境&#xff0c;以在其中运行和测试应用程序&#xff0c;容器主要由从 docker hub 或其他公共镜像存储库提取的开源镜像组成。但是这些开源镜像有时可能包含一些漏洞&#xff0c;这些漏洞可能会危害容器的安全&#xff0c;进而危害其主机/服务…

linux全过程图解图片,安装 Mandriva Linux全过程《图解》

wide 于 2006-02-26 10:29:58发表:设定帐号Mandriva 是一个可供多人使用的作业系统&#xff0c;使用者必须先在系统中拥有帐号才可以使用。而登入时&#xff0c;则必须输入帐号及密码&#xff0c;验证无误后方可进入。 本章将介绍如何在安装时设定使用者帐号及密码。何谓系统管…

c语言程序编写一朵花,一朵花(中英双语)

一朵花A Flower作者&#xff5c;白鹤清泉(Baihe Qingquan)英译&#xff5c;周柯楠(Zhou Kenan)轻轻地走近你的世界Gently I approach your world默默地与你对视Looking you in the eye silently我用眼睛嘴唇与你贴近I keep close to you with my eyes and lips只为听到你芬芳的…

硬解析优化_72最近一次现场生产系统优化的成果与开发建议

上周给南京某客户一个重要业务系统的数据库做优化&#xff0c;能实施的马上做了实施&#xff0c;优化前后性能对比非常明显&#xff0c;系统最为严重的IO负载过重问题基本得到解决&#xff1a;优化前一天的物理读是48亿次&#xff0c;优化后是15亿次&#xff0c;效果那是刚刚的…

XM7 FOR ANDROID,视频剪辑制作app-视频剪辑制作xm8.0安卓版-蜻蜓手游网

视频剪辑制作是一款很好用的手机视频编辑软件&#xff0c;在这里你可以进行视频剪辑、制作字幕、背景音乐制作等&#xff0c;让你可以轻松的制作视频&#xff0c;需要视频剪辑制作的就来蜻蜓手游网下载吧&#xff01;软件功能【背景配乐】给视频添加背景音乐&#xff0c;支持MP…

混凝土墙开洞_易县混凝土剪力墙切割常见问题

易县混凝土剪力墙切割常见问题北京专业切割 承接水泥地面切割路面切割 混凝土地面切割 地面切割开线槽 楼板切割 墙体切割 柱子切割 沥青地面切割 洋灰地面切割 切割开线槽 。是一个以建筑液压钳拆除结构加固和切割拆除、水钻钻孔的综合性公司。加固设计、混凝土外部粘钢加固、…

差分放大电路差模共模公式_差分放大电路对差模信号和共模信号有什么影响?...

现在在应用中使用的放大电路一般都是由各级级联组成的&#xff0c;直接级联的放大电路各级的直流通路相互关联&#xff0c;因而当前级的静态工作点由于某种原因而稍有偏移时&#xff0c;这种缓慢的微小变化就会逐级影响&#xff0c;致使放大器的输出端产生较大的电压漂移&#…

html本地载入缓存文件,Flutter中如何加载并预览本地的html文件的方法

搜索热词直接进入主题&#xff0c;大概步骤如下在 assets 创建需要访问 html 文件&#xff0c;如下这里创建一个files文件夹&#xff0c;专门来放这些静态 html 文件.在 pubspec.yaml 中配置访问位置assets:- assets/images/- assets/files/在 pubspec.yaml 添加 webview_flutt…

三维数据平滑处理_关于CAD三维对象建模

下面是本公众号文章分类目录&#xff0c;点击标题文字可打开分类文章列表&#xff1a;安装卸载 异常、退出 文件及输入输出 基本操作技巧 设置及相关问题 界面和显示 快捷键 视图设置和调整 图层管理 颜色 线型 字体、文字样式和文字输入 标注、引线和标注样式 坐标系…

html下拉列表框的长度,HTML中如何定义下拉列表框的默认长度?

一共两个文件,html页面里面调用js文件就可以了,不是要把代码也复制到html文件里面^……联动菜单 是这个意思吗?实现方法很多 推荐一个比较好的:琥珀联动菜单以下信息为琥珀联动菜单&#xff1a;(在此感谢作者&#xff01;)下面是静态页面&#xff1a;HPMenu_Demo.html<html…

3蛋白wb_老司机手把手教你选WB内参

俗话说&#xff0c;一个生物学博士&#xff0c;要跑满1000面胶才能毕业。今天特邀实验室博三大师兄&#xff0c;和大家聊一聊WB内参那些小事。选择好合适并且好跑的内参&#xff0c;WB实验也就成功了一半。1. 什么是内参&#xff1f;内参即内部参照&#xff0c;一般是指由管家基…

制作支付页面弹框html,JS实现仿微信支付弹窗功能_蜡烛_前端开发者

先奉上效果图/p>body {margin: 0;padding: 0;font-size: 0.3rem;font-family: "微软雅黑", arial;}ul,li {margin: 0;padding: 0;list-style: none;}img {display: block;}#myBtn {display: block;width: 80%;height: auto;margin: 5rem auto;padding: 0.2rem;bor…

matlab 判断鼠标按下_轻巧可爱,支持多设备——雷柏Ralemo Air1乐萌鼠标

手机可以连接显示器&#xff0c;变成桌面系统&#xff0c;iPadOS支持鼠标操作&#xff0c;越来越多的智能设备都可以做到轻办公的使用需求&#xff0c;而办公必不可少就是鼠标&#xff0c;如果说为了每个设备都配个鼠标未免有点太过奢侈&#xff0c;今天介绍一款造型独特&#…

电子科学与技术与计算机专业,计算机科学与技术专业和电子科学与技术专业,哪个好些?...

作为计算机科学与技术专业的学生&#xff0c;这个必须怒答一波&#xff0c;其他学校我是不清楚&#xff0c;就我们学校&#xff0c;我们专业简直比电子科学与技术好太多。先说说培养方案吧计算机科学与技术:本专业培养具有良好的科学素养&#xff0c;系统掌握计算机科学与技术,…

kafka topic 一段时间不消费_全网最通俗易懂的 Kafka 入门

众所周知&#xff0c;消息队列的产品有好几种&#xff0c;这里我选择学习Kafka的原因&#xff0c;无他&#xff0c;公司在用。我司使用的是Kafka和自研的消息队列(Kafka和RocketMQ)改版&#xff0c;于是我就想学学Kafka这款消息队列啦。本篇文章对Kafka入门&#xff0c;希望对大…