直觉模糊C均值聚类算法

上次实现的模糊均值聚类算法有一点小问题。与聚类中心的距离应该是平方,我直接做了一个开方。
直觉模糊集是模糊集的扩展,因此理论上而言直觉模糊C均值聚类算法的聚类效果会更好。
直觉模糊集的定义是:设<A,B>是U的一对模糊子集构成的序偶。如果对于任意x属于U,都成立A(x)+B(x)<=1则称C=<A,B>是U上的一个直觉模糊子集。称为A,B为隶属度和非隶属度。
不过这种算法最大的问题是资料中给定的目标函数并不统一。我查阅了四份资料,给出了三种不同的定义方式,而且相互并不等价,因此我选择了一种最简单的方式(唯一我能解出偏导的方式.......)进行推导和实现。其中这四分资料分别为:https://blog.csdn.net/liyuefeilong/article/details/43816495
王昭,范九伦,娄昊,赵凤.一种融入局部信息的直觉模糊C-均值聚类图像分割算法[J].计算机应用研究,2014,31(09):2864-2866+2872.
兰蓉,林洋.抑制式非局部空间直觉模糊C-均值图像分割算法[J].电子与信息学报,2019,41(06):1472-1479.
Lan R, Fan J L, Liu Y, et al. Image thresholding by maximizing the similarity degree based on intuitionistic fuzzy sets[M]//Quantitative Logic and Soft Computing 2016. Springer, Cham, 2017: 631-640.
我使用兰蓉论文中对犹豫度的定义方法,添加一个条件:最小化犹豫,进行求解。然而我认为这四篇论文的区别就在于对犹豫度的定义。理论上犹豫度应该为1-A(x)-B(x)=Π(x),但是论文中定义的为Π(x)=2A(X)(1-A(X))。这是我没有理解的。因此总的目标函数转变为:

QQ截图20190707164648.jpg

约束条件和FCM相同为:
QQ截图20190707164619.jpg

因此根据约束条件下的最值求法-拉格朗日乘数法。可以写为以下形式。
QQ截图20190707165045.jpg

对c求偏导可以发现增加的条件也就是第二项作为常数没有发挥作用。因此聚类中心的公式与FCM完全相同。具体求导过程较为简单可以参考以下两篇博客的求导过程。
https://blog.51cto.com/9269309/1867818
https://www.cnblogs.com/xiaohuahua108/p/6187178.html
对μ的偏导较为麻烦,而且为了求偏导方便m直接设置为2(换成别的值我就求不出来了.....)。具体迭代过程是针对单个值因此第二个求和符号可以略去以方便计算。
图片.png

可以求解出j对于u的偏导,并令其等于0.
QQ截图20190707170907.jpg

很容易求出:
QQ截图20190707171149.jpg

再带入约束条件:
QQ截图20190707171720.jpg

(此处省略了下标)
可以求出:
QQ截图20190707172016.jpg

因此可以将此带入u的表达式,最终算出u的最终表达式。


QQ截图20190707172409.jpg

因此对比FCM的表达式,只是多了个-2。我觉得怪怪的。而且实际聚类结果也非常奇怪。
1.png

贴出代码吧,希望学习模糊集和图像分割的朋友能指出问题所在。
import numpy as np
class IFCM():
    def __init__(self,n_clusters):
        super(IFCM, self).__init__()
        self.n_clusters = n_clusters
        self.u = None
        self.core = None
        
    def initialize_U(self,data_num):
        u = np.random.rand(data_num, self.n_clusters)
        data_max = np.sum(u, axis=1)
#        print(data_max)
        data_max = np.tile(data_max, (self.n_clusters,1)).T
        u = np.true_divide(u,data_max)
        self.u = u
        return u
    
    def fit(self,data,max_item=100):
        m=2
        self.u = self.initialize_U(data.shape[0])
        for i in range(max_item):
            ############################更新聚类中心############################
            new_core = []
            for data_dimension in range(self.n_clusters):
                u_tmp = np.tile(self.u[:,data_dimension],(data.shape[1],1)).T
                u_tmp = np.power(u_tmp,m)
                new_core.append(np.true_divide(np.sum(np.multiply(u_tmp,data),axis=0),\
                                               np.sum(u_tmp,axis=0)))
            new_core = np.array(new_core)
            self.core = new_core
#            print(new_core)            
            #############################计算各点与聚类中心的距离################
            new_core_tmp = new_core.reshape((new_core.shape[0],1,new_core.shape[1]))
            new_core_tmp = np.tile(new_core_tmp,((1,data.shape[0],1)))
            
            data_tmp = data.reshape((1,data.shape[0],data.shape[1]))
            data_tmp = np.tile(data_tmp,((self.n_clusters,1,1)))
            distance_tmp = np.subtract(new_core_tmp,data_tmp)
            distance_tmp = np.power(distance_tmp,2)
            distance_tmp = np.sum(distance_tmp,axis=2)
#            distance_tmp = np.power(distance_tmp,1/2).T
            distance_tmp = distance_tmp.T-2
            #############################更新隶属矩阵###########################
            tmp1 = distance_tmp.reshape((distance_tmp.shape[0],distance_tmp.shape[1],1))
            tmp1 = np.tile(tmp1,(self.n_clusters))
            
            tmp2 = np.tile(distance_tmp,(self.n_clusters))
            tmp2 = tmp2.reshape((distance_tmp.shape[0],distance_tmp.shape[1],self.n_clusters))
            
            new_u = np.true_divide(tmp1,tmp2)
            new_u = np.sum(new_u,axis=2)
            new_u = np.power(new_u,-1)
            #############################查看迭代是否终止########################
            subtract_2_u = np.sum(np.fabs(np.subtract(self.u,new_u)))
            self.u = new_u
#            print(subtract_2_u)
            if subtract_2_u == 0:
                break
#            print(new_u)
            
    def fit_predict(self,data,max_item=1000):
        ans = []
        if self.u == None:
            self.fit(data,max_item=max_item)
        ans = np.argmax(self.u, axis=1)
        return ans
            
            
if __name__ =='__main__':
    cls = IFCM(n_clusters=2)
#    cls.fit(np.random.rand(5, 3),2)
    ans = cls.fit_predict(np.random.rand(5, 3),2)
    print(ans)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容

  • 【嵌牛导读】FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的...
    于占胜阅读 19,591评论 0 4
  • 1.无监督学习:简介 聚类算法:第一个无监督学习算法(无标签的数据) 什么是无监督学习呢?对比:监督学习问题指的是...
    带刺的小花_ea97阅读 12,821评论 0 5
  • 引言 昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了。于是昨天下午开始到今天凌晨3点,便研究了...
    Alukar阅读 1,576评论 1 14
  • 以西瓜书为主线,以其他书籍作为参考进行补充,例如《统计学习方法》,《PRML》等 第一章 绪论 1.2 基本术语 ...
    danielAck阅读 4,514评论 0 6
  • 文/小妖 很多时候,我会沉浸在一种痛苦使不上力的无限循环中。 知道了很多道理,依然要愚蠢地过完这一生。 努力地规划...
    Max的书桌阅读 274评论 0 4