精华内容
下载资源
问答
  • 模糊c均值聚类fcm算法
    2022-07-11 15:41:19

    一、模糊

            “模糊”:一个元素可以不同程度的属于某几个子集,也就是说元素对于集合的隶属度可以在[0,1]上取连续值。

    二、步骤

    2.1步骤

    翻译一下: 

    S1:初始化参数:加权指数m,簇心数目C,以及迭代停止阈值ε

    S2:随机初始化隶属度矩阵U,注意满足式(2-2)。

    S3:式(2-3)更新簇心c。

    S4:式(2-4)更新隶属度矩阵U

    S5:如果隶属度矩阵U满足式(2-5)则返回U并结束算法,否则转到S2

    各种式如下:

     

    2.2流程图

            流程图比步骤多的一项是计算目标函数J,这一步可有可无,为了观察目标函数的变化趋势,我们在流程图和代码里都加上了计算目标函数这一步。

    三、代码

    import numpy as np
    import matplotlib.pyplot as plt
    import time
    star = time.time()  # 计时
    img = plt.imread('1.jpg')  # 读取图片信息,存储在一个三维数组中
    row = img.shape[0]
    col = img.shape[1]
    plt.figure(1)
    plt.subplot(221)
    plt.imshow(img)
    
    
    def fcm(data, threshold, k, m):
        # 0.初始化
        data = data.reshape(-1, 3)
        cluster_center = np.zeros([k, 3])  # 簇心
        distance = np.zeros([k, row*col])  # 欧氏距离
        times = 0  # 迭代次数
        goal_j = np.array([])  # 迭代终止条件:目标函数
        goal_u = np.array([])  # 迭代终止条件:隶属度矩阵元素最大变化量
        # 1.初始化U
        u = np.random.dirichlet(np.ones(k), row*col).T  # 形状(k, col*rol),任意一列元素和=1
        #  for s in range(50):
        while 1:
            times += 1
            print('循环:', times)
            # 2.簇心update
            for i in range(k):
                cluster_center[i] = np.sum((np.tile(u[i] ** m, (3, 1))).T * data, axis=0) / np.sum(u[i] ** m)
            # 3.U update
            # 3.1欧拉距离
            for i in range(k):
                distance[i] = np.sqrt(np.sum((data - np.tile(cluster_center[i], (row * col, 1))) ** 2, axis=1))
            # 3.2目标函数
            goal_j = np.append(goal_j, np.sum((u**m)*distance**2))
            # 3.3 更新隶属度矩阵
            oldu = u.copy()  # 记录上一次隶属度矩阵
            u = np.zeros([k, row * col])
            for i in range(k):
                for j in range(k):
                    u[i] += (distance[i] / distance[j]) ** (2 / (m - 1))
                u[i] = 1/u[i]
            goal_u = np.append(goal_u, np.max(u - oldu))  # 隶属度元素最大变化量
            print('隶属度元素最大变化量', np.max(u - oldu), '目标函数', np.sum((u**m)*distance**2))
            # 4.判断:隶属度矩阵元素最大变化量是否小于阈值
            if np.max(u - oldu) <= threshold:
                break
        return u, goal_j, goal_u
    
    
    if __name__ == '__main__':
    
        img_show, goal1_j, goal2_u = fcm(img, 1e-09, 5, 2)
        img_show = np.argmax(img_show, axis=0)
        # plt.figure(2)
        plt.subplot(223)
        plt.plot(goal1_j)
        plt.rcParams['font.sans-serif'] = ['SimHei']
        plt.rcParams['axes.unicode_minus'] = False
        plt.title('目标函数变化曲线')
        plt.xlabel('迭代次数')
        plt.ylabel('目标函数')
        # plt.figure(3)
        plt.subplot(224)
        plt.plot(goal2_u)
        plt.title('隶属度矩阵相邻两次迭代的元素最大变化量变化曲线')
        plt.xlabel('迭代次数')
        plt.ylabel('隶属度矩阵相邻两次迭代的元素最大变化量')
        # plt.figure(1)
        plt.subplot(222)
        plt.imshow(img_show.reshape([row, col]))
        end = time.time()
        print('用时:', end - star)
        plt.show()
    

    四、代码怎么用?

            第一步,需要把待分割图片放入项目文件,like this:

     

            第二步 ,代码的第5行:'img = plt.imread()',在括号里加入图片路径:“图片名.文件格式”,比如,1.jpeg、2.bmp等等。

    五、运行结果

            1.迭代终止条件的阈值:1e-09;簇总数:5;m=2,迭代了114次

            2. 迭代终止条件:1e-09;簇总数:2;m=2,迭代了16次

             3.迭代终止条件:1e-09;簇总数:5;m=2,迭代了170次,用时2306s

    六、终止条件为目标函数变化值小于阈值:

    6.1步骤

    S1:初始化参数:加权指数m,簇心数目C,以及迭代停止阈值ε

    S2:随机初始化隶属度矩阵U,注意满足式(2-2)。

    S3:式(2-3)更新簇心c。

    S4:式(2-1)计算目标函数,如果变化值小于阈值,则返回U并结束算法,否则转到S2

    S5:式(2-4)更新隶属度矩阵U

    6.2 流程图

     七、代码详解

    7.1产生和为1的随机数

     7.1.1德雷克分布

            产生(m ,n)的二维数组,每行元素和=1

    import numpy as np
    x = np.random.dirichlet(np.ones(n), size=m) 
    

    7.1.2返回值

            形状:(1, 20),二维数组。

            转换为向量:x=x[0]

            类型:ndarray

    7.2三维数组 

    7.2.1三维和二维

            形状(k, m, n)的三维数组,相对于k个形状(m, n)的二维数组

    7.2.2索引二维数组

            三维数组arr,形状(k,m,n)。arr第1个二维数组为arr[0]

    7.3未知形状数组加入新值

    7.3.1应用场景

            在某一循环内,在循环的总次数不清楚的情况下,需要记录每次循环的结果。即需要给一个不清楚长度数组加入元素。

            比如,在代码中,每次循环都记录目标函数的值,但是循环的总次数每次都不确定。

    7.3.2实现

            先定义x是一个空数组,再通过x.append()加入新值。

    x = np.array([])
    for i in range(n):
    	…
    	x.append(data)
    

    还有一些关于语法的解释,可以看下面这篇,虽然是kmeans算法但是编程上原理差不多。

     基于K-means的图像分割(python代码详解)_白菜想出去转转的博客-CSDN博客

    更多相关内容
  • 模糊均值聚类算法
  • 课程的随堂作业,C++的,用dev就能运行,模糊聚类的程序,老师要统计数据分类,所以这还是可以用来交作业混一下的
  • 模糊c均值聚类 FCM算法的MATLAB代码.doc
  • 模糊c均值聚类FCM算法的matlab代码
  • FCM+KFCM模糊C均值聚类分析算法,matlab代码,有界面,有图片,运行正常,附pdf说明文档
  • 针对模糊C均值聚类算法(FCM)存在对初始聚类中心敏感,易陷入局部最优解的不足,将改进的粒子群聚类算法与FCM算法相结合,提出了一种基于粒子群优化的模糊C均值聚类算法。该算法对粒子群初始化空间及粒子移动最大速度...
  • fcmMatlab中的模糊c均值聚类算法
  • 求助模糊C均值聚类FCM-fcm.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 模糊C均值聚类算法实现数据挖掘的matlab源代码
  • 模糊C均值聚类FCM),模糊c均值聚类算法的优缺点,matlab源码.zip
  • 模糊 c 均值聚类 FCM 算法的 MATLAB 代码 我做毕业论文时需要模糊 C-均值聚类找了好长时间才找到这个分享给大家 FCM 算法的两种迭代形式的 MATLAB 代码写于下,也许有的同学会用得着: m 文件 1/7: function [U,P,Dist...
  • 模糊C均值聚类算法

    2015-01-19 10:09:11
    自己写的模糊C均值聚类算法,也就是FCM,用matlab写的,希望能帮助大家学习
  • 模糊c均值聚类 FCM算法的MATLAB代码

    热门讨论 2011-04-11 10:09:55
    模糊c均值聚类 FCM算法的MATLAB代码
  • 模糊均值聚类算法
  • 求助模糊C均值聚类FCM-fcm2.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 模糊c-均值(FCM)聚类算法在matlab中实现,已测试通过
  • 适合初学者学习,最基本的模糊计算中的模糊C均值聚类算法,程序下载后即可运行。
  • 求助模糊C均值聚类FCM-fcm_calcD.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 模糊C均值FCM聚类算法详解

    热门讨论 2011-04-01 19:26:53
    模糊C均值 FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小。模糊C均值 算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM...
  • 求助模糊C均值聚类FCM-fcm_evalJ.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 求助模糊C均值聚类FCM-fcm_dataInitC.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 求助模糊C均值聚类FCM-fcm_calcU.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 求助模糊C均值聚类FCM-fcm_calcC.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!
  • 模糊C均值聚类算法(FCM)是一种比较有代表性的模糊聚类算法,主要是通过迭代更新聚类中心和隶属度矩阵,使目标函数值达到最小.FCM算法还有很多缺陷和不足,其中最主要的就是选取不同的初始中心,会得到不同的聚类结果,...
  • 模糊C均值聚类FCM算法介绍及其Python实现

    千次阅读 多人点赞 2020-07-22 16:55:33
    目录一、理论介绍二、算法实现思路三、FCM算法核心代码的python实现四、使用示例1.对数据进行聚类2.图片分割五、实现时出现的错误总结六、源码链接 一、理论介绍 二、算法实现思路 下面给出该算法的基本思路: ...

    这篇文章是楼主老早之前做课后作业写的,如果有问题的话建议米娜桑自行解决哦~

    一、理论介绍

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    二、算法实现思路

    下面给出该算法的基本思路:
           1.可以先初始化一个隶属度矩阵U(每个样本对各个类的隶属度和为1)。
           2.根据U开始对类中心矩阵C进行计算。
           3.再根据C计算U。
           4.循环2,3步骤直到满足循环条件,结束。

    三、FCM算法核心代码的python实现

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    四、使用示例

    1.对数据进行聚类

    下面我用np的random生成一些数据来对FCM进行展示
    示例1:
    在这里插入图片描述

    示例2:
    在这里插入图片描述

    示例3:
    在这里插入图片描述


    2.图片分割

    在这里插入图片描述
    下面展示图片分割的结果~

    灰度图:(下面展示聚类中心为2和15两种)
    在这里插入图片描述
    在这里插入图片描述

    Ps:聚类中心不要设太大,图片不要太大!!!

    彩图:
    在这里插入图片描述

    在这里插入图片描述

    可以看到,分割后的图片还是能有清晰的轮廓,只是灰度或色彩的种类数减少了。



    五、实现时出现的错误总结

    在这里插入图片描述

    六、源码链接

    点击此处,混合食用最佳

    展开全文
  • 针对传统模糊<em>C均值(FCM) 聚类算法对结构复杂图像分割效果不理想且算法执行效率较低的缺陷, 提出一种融合均值平移(mean shift) 的FCM聚类算法. 利用mean shift 算法将图像分成若干同质区域, 将此区域视为新的节点...
  • 求助模糊C均值聚类FCM-searchMub.m 俺现在要用Matlab实现一个 模糊C均值聚类 算法,很着急啊!有谁有的话,请高抬贵手,给俺回一下,谢谢谢谢你啦!!!!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,149
精华内容 459
关键字:

模糊c均值聚类fcm算法