K-center聚类的python实现

news/2024/5/20 7:54:20 标签: python, 聚类

文章目录

  • 介绍
  • 函数介绍
  • 实例

作者:张双双

介绍

K-center聚类和K-means聚类类似,都是通过迭代类中心点直至收敛,不同的是K-center的中心点必须是一个真实的样本点,而K-means并不需要。

函数介绍

python">class Kmedoid:
    def __init__(self, data, k):
        self.data = data
        self.k = k

    def randCent(self):  # 随机选取一个点
        random_index = random.randint(0, self.data.shape[0]-1)
        return random_index, self.data[random_index, :]

    def distance(self, vecA, vecB):  # 计算曼哈顿距离
        return sum(abs(vecA - vecB))

    def run(self):
        init_centers = []  # 初始化中心的列表
        init_indexs = []  # 被选中作为中心的点的下标
        while len(init_centers) < self.k:
            index, center = self.randCent()
            if index not in init_indexs:  # 保证选点不重复
                init_centers.append(center)
                init_indexs.append(index)
            else:
                continue

        while True:
            cluster_category = []  # 记录聚类结果
            for i in range(self.data.shape[0]):  # 遍历每一个点
                minv = np.inf  # 最小距离,初始为正无穷
                cluster_index = 0  # 所属簇的下标
                for index, center in enumerate(init_centers):  # 遍历每个中心
                    # 选取离得最近的中心作为归属簇
                    dist = self.distance(center, self.data[i, :])
                    if dist < minv:
                        minv = dist
                        cluster_index = index
                cluster_category.append(cluster_index)

            # 重新计算中心点
            new_indexs = [0 for i in range(len(init_centers))]  # 更新被选中作为中心的点的下标
            min_dists = [np.inf for i in range(len(init_centers))]  # 中心点对应最小距离
            for i in range(self.data.shape[0]):
                min_dist = 0  # 求与当前簇其他点的距离之和
                for j in range(self.data.shape[0]):  # 遍历每一个点
                    if cluster_category[i] == cluster_category[j]:  # 属于同一个簇才进行累加
                        min_dist += self.distance(self.data[i, :], self.data[j, :])
                if min_dist < min_dists[cluster_category[i]]:  # 保存数据到列表
                    min_dists[cluster_category[i]] = min_dist
                    new_indexs[cluster_category[i]] = i

            init_centers = []  # 新的聚类中心
            for index in new_indexs:
                init_centers.append(self.data[index, :])

            if new_indexs == init_indexs:  # 如果新的中心与上次相同则结束循环
                return cluster_category, init_centers
            else:
                init_indexs = new_indexs  # 更新聚类中心下标

实例

python">import random
import numpy as np
from sklearn.datasets import make_blobs
from matplotlib import pyplot
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

ir = datasets.load_iris() 
y = ir.data[:, :4] # #表示我们取特征空间中的4个维度

model = Kmedoid(data=y, k=3)
cluster_category, init_centers=model.run()

dat=np.concatenate([y,np.array(cluster_category).reshape(-1,1)],axis=1)
columns=ir.feature_names
columns.append('result')

X=pd.DataFrame(dat,columns=columns)


# 绘制结果
x0 = X[X['result'] == 0]
x1 = X[X['result'] == 1]
x2 = X[X['result'] == 2]
plt.scatter(x0['sepal length (cm)'], x0['sepal width (cm)'], c="red", marker='o', label='label0') 
plt.scatter(x1['sepal length (cm)'], x1['sepal width (cm)'], c="green", marker='*', label='label1') 
plt.scatter(x2['sepal length (cm)'], x2['sepal width (cm)'], c="blue", marker='+', label='label2') 
plt.xlabel('sepal length') 
plt.ylabel('sepal width') 
plt.legend(loc=2) 
plt.show()

在这里插入图片描述


http://www.niftyadmin.cn/n/1565421.html

相关文章

idft重建图像 matlab_ISMRM社区最全MRI序列仿真,重建,后处理仿真学习工具包

ISMRM社区成员针对不同的应用&#xff0c;比如序列设计&#xff0c;序列重建&#xff0c;图像处理&#xff0c;仿真等场景&#xff0c;开发了很多有用的工具包&#xff0c;这里汇总了一下总共有24个工具包&#xff0c;有哪些您认识呢&#xff1f;又有哪些您使用过呢&#xff1f…

struts2访问jsp页面异常The Struts dispatcher cannot be

利用Struts2进行开发&#xff0c;当访问某个jsp页面时我们可能会遇到&#xff1a; org.apache.jasper.JasperException: The Struts dispatcher cannot be 一般是web.xml中核心过滤器没有配置好 在web.xml文件中添加一个过滤设置&#xff1a; <filter-mapping> <filt…

ubuntu 9.04 环境下实现ylp2410 Linux2.6.8内核编译

今天终于在ubuntu上完成了内核编译&#xff0c;现将过程记录如下。 首先&#xff0c;先装qt一些相关的软件包&#xff0c;若后面提示有错误&#xff0c;很可能是缺少一些软件包&#xff0c; 再使用sudo apt&#xff0d;get install &#xff0a;&#xff0a;命令即可下载安装。…

bootstrap综合大作业_大庆秸秆可收集量436.5万吨 综合利用率已达74.7%

点击蓝字关注我们近日&#xff0c;从大庆市农业农村局获悉&#xff0c;2020年&#xff0c;大庆市秸秆可收集量436.5万吨&#xff0c;截至12月7日&#xff0c;大庆市秸秆综合利用量326.3万吨、利用率74.7%。前不久&#xff0c;全省秸秆综合利用第五指导组深入大庆市&#xff0c;…

手把手搭建一个完整的SSH项目(适合新手)

为了方便大家&#xff0c;同时也为了加深自己的记忆&#xff0c;这里小落自己搭建一个ssh项目 我把项目搭建步骤都先写出来&#xff0c;使大家在编写代码上更明确 项目源码下载 1.新建一个项目 导入必须的jar包 2.创建db.properties文件并配置 db.properties jdbc.userro…

释放SQL Server占用的内存

由于Sql Server对于系统内存的管理策略是有多少占多少&#xff0c;除非系统内存不够用了&#xff08;大约到剩余内存为4M左右&#xff09;&#xff0c;Sql Server才会释放一点点内存。所以很多时候&#xff0c;我们会发现运行Sql Server的系统内存往往居高不下。这些内存一般都…

ue4打包安卓发送udp报文_UE4修改自Rama的UDP通信蓝图插件

UE4.15没有提供蓝图UDP的组件&#xff0c;可以在网上找到一个ID叫Rama写的源代码&#xff0c;我把它封装成插件了(MyUdpPlugin)&#xff0c;方便在各个UE4版本工程中使用UDP通信。使用方式&#xff1a;1、在自己的工程根目录下新建一个Plugins文件夹&#xff0c;将MyUdpPlugin拷…

手把手搭建一个完整的javaweb项目(适合新手)

手把手搭建一个完整的javaweb项目 本案例使用Servletjsp制作,用MyEclipse和Mysql数据库进行搭建&#xff0c;详细介绍了搭建过程及知识点。 下载地址&#xff1a;http://download.csdn.net/detail/qq_23994787/9904842 点击下载 主要功能有&#xff1a; 1.用户注册 2.用户…