模糊c均值聚类算法的c++实现

本文介绍了如何使用C++实现模糊c均值(FCM)聚类算法,包括初始化聚类中心、计算距离、更新隶属度矩阵和聚类中心,以及根据距离判断停止条件。在算法实现过程中,注意点的随机初始化可能导致分类错误,但在大量数据情况下可忽略。同时,当点接近某一聚类中心时,其隶属度被设置为1,其他为0。欢迎交流讨论。

首先输入点的个数,维度,分类数目

我的代码FCM中主要过程如下:

1:(init_c函数)随机初始化聚类中心

2:(comp_dis函数)计算每个点到每个聚类距离 dis[i][j] 表示i点到j聚类中心的距离

3:(while(1))进入循环

4:(comp_u函数)计算隶属度矩阵u[i][j]表示i点对应j聚类中心的隶属度

5:(update_c函数)根据隶属度和每个点的位置更新聚类中心

6:(compdis函数)因为聚类中心更新了嘛,再重新计算下每个点到每个聚类中心的距离

7:(comp_obj_func函数)计算函数值差值如果小于设定值eps则进行第8步,否则进行第9步

8:(break)退出循环

9:根据每个点的隶属度情况,给每个点分类(距离哪个聚类中心近,就给谁)

注意事项:

1.如果点很少的话,可能在我的初始化聚类中心函数中会有相同的点,造成分类错误,但实际应用中,点数足够多的情况则这个概率可以忽略

2.在计算隶属度的函数中,如果一个点距离一个聚类中心足够的近,那么直接将它的隶属度设置成1,其他的为0

其他:

如果有错误和疑问欢迎探讨,望多多指教!

#include<iostream>
#include<cstdio>
#include<vector>
#include<fstream>
#include<cmath>
#include<ctime>
#include<cstdlib>
using namespace std;
struct Mode
{
    int x,y;
    int di;
    vector<double> datas;
};
typedef vector<vector<Mode> > ModeVec;
const int N=1000;
const double eps=1e-2;
const double eps_dis=1
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值