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,一经查实,立即删除!

相关文章

matlab 投票法_张量投票算法及其使用并分析.pdf

张量投票算法及其使用并分析摘 要本文主要介绍了一种新的数据分析算法&#xff0c;即张量投票算法&#xff0e;该算法完全利用图像数据&#xff0c;根据张量分析&#xff0c;矩阵论和几何的知识&#xff0c;对数据点进行编译和几何阐释&#xff0c;再根据心理学中的Gestalt原理…

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

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

lan口配置 petalinux_【Xilinx-Petalinux学习】-02-建立PetaLinux工程

前面我已经把PetaLinux成功安装到了Ubuntu虚拟机当中了&#xff0c;接下来就要实际操作&#xff0c;将PetaLinux移植到我们自己的硬件平台当中去。step1&#xff1a;硬件描述文件有两种PetaLinux工程建立的方法&#xff0c;一种是下载官方开发板的BSP包并安装&#xff0c;一种就…

oracle其他盘添加表空间吗,oracle增加表空间的四种方法

实例1&#xff1a;在中&#xff0c;磁盘空间不足是DBA都会遇到的问题&#xff0c;问题比较常见。--1查看表空间已经使用的百分比select a.tablespace_name,a.bytes/1024/1024 "SumMB",(a.bytes-b.bytes)/1024/1024 "used MB",b.bytes/1024/1024 "free…

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请输入口令:连…

广告冷启动_亚马逊新品冷启动,你的广告策略怎么定?

上新品&#xff0c;没有黑科技加持&#xff0c;纯靠PPC广告冷启动&#xff0c;你会怎么做&#xff1f;我们先来看看运作成功且销售情况稳定的ASIN的流量组成&#xff1a;对比这些数据&#xff0c;大家可以算算自己漏掉了多少流量。占了大头的关联流量中&#xff0c;又以“Newer…

oracle报28003,【翻译自mos文章】运行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误...

运行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误。适用于&#xff1a;Oracle Server - Enterprise Edition - Version 8.1.7.0 and laterInformation in this document applies to any platform.Checked for relevance on 15-Sep-2012原因&…

mysql 天数减1_mysql 日期加减天数

MySQL 为日期增加一个时间间隔&#xff1a;date_add()now() //now函数为获取当前时间select date_add(now(), interval 1 day); - 加1天select date_add(now(), interval 1 hour); -加1小时select date_add(now(), interval 1 minute); - 加1分钟select date_add(now(), …

oracle注入过滤了单引号,sql绕过单引号限制继续注入的解决方法

在防范sql注入时&#xff0c;对变量过滤不足甚至没有过滤而构造畸形SQL语句&#xff0c;极有可能被成功注入&#xff0c;比如下面这行sql&#xff0c;相当轻松就注入成功了&#xff1a;代码示例:http://www./show.asp?id1;exec master.dbo.xp_cmdshell net user angel pass /a…

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

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

oracle data guard闪回,11gR2 Active Data Guard 闪回 - flashback database / snapshot standby - 2

二&#xff0c;11g 使用snapshot方式设置Data Guard闪回snapshot standby是11g引入的新特性&#xff0c;它不需要开启flashback database特性&#xff0c;就可以让physical standby数据库以read-write模式开启&#xff0c;而后可以退回到standby模式&#xff0c;所有open模式下…

fp算法例题_机器学习(九)—FP-growth算法

本来老师是想让我学Hadoop的&#xff0c;也装了Ubuntu&#xff0c;配置了Hadoop&#xff0c;一时间却不知从何学起&#xff0c;加之自己还是想先看点自己喜欢的算法&#xff0c;学习Hadoop也就暂且搁置了&#xff0c;不过还是想问一下园子里的朋友有什么学习Hadoop好点的资料&a…

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

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

封头名义厚度如何圆整_松原封头价格

松原封头价格这种情况下我们常常是选用宽度1500毫米的板材开展下料。同时为了保证其的宽度&#xff0c;借此需要下两块料。此外在下料前需要在原板材上面选择一段试样&#xff0c;需对试样实施物理性能测试和化学元素含量的测试&#xff0c;缘于物理性能决定封头的减薄率&#…

Linux系统驱动全吗,linux系统需要给硬件安装驱动程序么?谁推荐一下linux系统阿~要驱动最全...

需要&#xff0c;不过大部分linux都自带&#xff0c;少量的也都有自动安装文件 比如ati的显卡驱动什么的。之前还自己写过驱动&#xff0c;linux的驱动比windows的驱动透明度高很多大部分硬件基本上 都可以识别的 也可以通过网络更新 之前我用ubantu的时候是这样的 别的没试过 …

div和div之间画横线_javascript – jQuery – 使用画布在div之间绘制线条

我会把div定位为绝对的,然后把它们放在你想要的地方.然后用这个功能获得他们的位置&#xff1a;//Get the absolute position of a DOM object on a pagefunction findPos(obj) {var curLeft curTop 0;if (obj.offsetParent) {do {curLeft obj.offsetLeft;curTop obj.offse…

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修改services命令,Linux中service指令都有哪些参数

这是因为没有配置安装服务器配置安装服务器 如下1、 以root登录安装服务器,用命令 rpm –qa | grep tftp 查看是否安装了tftp软件包,如果没有&#xff0c;安装一下(安装软件的方法将在后面的文章中详细介绍)。2、 修改tftp的配置文件&#xff0c;使tftp服务可以随linux开机启动…

vim关闭下一行也是注释_在Vim中注释/取消注释行的快速方法是什么?

我有一个在vi中打开的Ruby代码文件&#xff0c;其中的行注释为#&#xff1a;class Search < ActiveRecord::Migrationdef self.up# create_table :searches do |t|# t.integer :user_id# t.string :name# t.string :all_of# t.string :any_of# t.string :none_of#…