COP-kMeans限制性--kMeans变体算法研究

简述

最近发现一篇有趣的论文。关于限制性的kMeans. 主要思想是基于boosting principle的COP-kMeans。所以,我就先研究了下COP-kMeans。

COP-kMeans

是一种限制性聚类算法。限制性的含义很简单,就是需要考虑到有些节点在聚类前,我们就知道了这个两个节点是应该放在一起,还是应该分开。

所以,这里有两类。最简单的想法,就是这里用一个二维矩阵来存储这个信息。
COP-kMeans,从名字上看,就知道这是一个基于kMeans的算法。

Python实现

  • 比较奇怪的点,这里我使用了一个函数内的函数定义。主要是考虑到了封闭性所以这样实现~
  • 关于使用: 在策略上,我用了最简单的策略。而且还存在有病态初始化的可能。所以,可能会出现一只被报错的情况~ 不用担心,多进行几次测试就好了,或者,你也可以直接改我的代码~
  • 代码实现上,基于我之前写过的k-Means. 只是加了一个验证的部分而已~
  • 耗时上也比kMeans要高,毕竟每次都需要检查两个表~

补充说明

在评论区的小哥提示下,我做了con的补充。意外发现代码有些小问题。这里补充下。

  • Con1和Con2是两个限制矩阵,大小规模为n*n,n为X的长度,即元素数量。
  • Con1是要保证在一个组的限制,Con2是要保证不在一个组的限制
  • 没有限制就为0,存在限制就非0.
def COP_K_means(X, n_clusters=3, Con1=None, Con2=None):
    
    clusters = np.random.choice(len(X), n_clusters)
    clusters = X[clusters]
    labels = np.array([-1 for i in range(len(X))])
    
    def validata_constrained(d, c, Con1, Con2):
        for dm, value in enumerate(Con1[d]): # should in the same group
            if value == 0: 
                continue
            if labels[dm] == -1 or labels[dm] == c: # has not allocated or ...
            	continue
            if labels[dm] != -1 and labels[dm] != c: # has allocated
            	return False
        
        for dm, value in enumerate(Con2[d]): # cannot in the same group
            if value == 0: 
                continue
            if labels[dm] == -1 or labels[dm] != c: # has not allocated or ...
            	continue
            if labels[dm] != -1 and labels[dm] == c: # has allocated
            	return False
        
        return True
        
            
    
    while True:
        labels_new = np.array([-1 for i in range(len(X))])
        for i, xi in enumerate(X):
            close_list = np.argsort([np.linalg.norm(xi - cj) for cj in clusters])
            
            unexpect = True
            for index in close_list:
                if validata_constrained(i,index, Con1, Con2):
                    unexpect = False
                    labels_new[i] = index
                    break
            if unexpect:
                raise Exception("Can not utilize COP-k-Means algorithm inside the dataset.")
        
        if sum(labels != labels_new) == 0:
            break
        
        for j in range(n_clusters):
            clusters[j] = np.mean(X[np.where(labels_new == j)], axis=0)
        labels = labels_new.copy()
    return labels
  • 效果~ 可以跟之前的kMeans进行对比
    在这里插入图片描述
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
为了设计一运算器实验平台,需要考虑以下几个方面: 1. 硬件平台:需要选择一款适合的开发板或者单片机作为硬件平台,并配合一些外设,如LED灯、按键、数码管等。 2. 编程语言:需要选择一种适合的编程语言进行编程,如C语言、Python等。 3. 模拟实验系统:需要模拟实验系统cop2000-8000的基本功能,如加减乘除、移位、逻辑运算等。 4. 输入操控:需要实现输入操控功能,可以通过按键输入或者串口通信等方式实现。 下面是一个基本的设计思路: 1. 硬件平台选择 可以选择一款性能较好的开发板或者单片机作为硬件平台,如STM32F103C8T6、Arduino等。需要根据实际需要选择相应的外设,如LED灯、按键、数码管等。 2. 编程语言选择 可以选择C语言、Python等编程语言进行编程。其中,C语言可以直接操作硬件,比较适合嵌入式系统开发;Python则更适合进行数据处理、图形界面展示等方面的开发。 3. 模拟实验系统设计 可以根据cop2000-8000的基本功能进行模拟实验系统的设计。需要实现加减乘除、移位、逻辑运算等功能。 4. 输入操控实现 可以通过按键输入或者串口通信等方式实现输入操控功能。可以在硬件平台上添加按键,通过按键输入来实现输入操控;也可以通过串口通信,将输入数据发送给硬件平台,实现输入操控功能。 综上,以上是一个基本的设计思路,具体实现还需要进一步的细化和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肥宅_Sean

公众号“肥宅Sean”欢迎关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值