python 实现简单的KMediod

3 篇文章 0 订阅

K-medoids 是 K-means 算法的一种改进算法,可以解决 K-means 中不稳定的问题,是一种基于聚类中心的距离度量方法,因此也被称为 partitioning around medoids (PAM)。

本篇博客将介绍 K-medoids 算法的原理和实现过程,并用 Python 实现一个 K-medoids 算法。

K-medoids 算法原理

K-medoids 算法是 K-means 算法的改进,和 K-means 算法相似,K-medoids 算法也是一种聚类算法,它的原理可以概括为以下几个步骤:

  1. 随机选择 k k k 个数据点作为初始聚类中心;
  2. 对于每个数据点,计算其到每个聚类中心的距离,将其划分到距离最近的聚类中心的簇中;
  3. 对于每个簇,选择一个离该簇内其他点距离之和最小的点作为新的聚类中心;
  4. 重复步骤 2 和步骤 3 直到聚类中心不再变化或达到最大迭代次数。

K-medoids 算法的主要特点是,每个聚类中心都是数据集中实际存在的点,而不像 K-means 算法那样只是虚拟点,这样可以有效避免 K-means 算法中聚类中心跑偏的问题。

K-medoids 算法实现

下面用 Python 实现一个简单的 K-medoids 算法,并使用 NumPy 库计算欧氏距离。

import numpy as np

class KMediod():
    def __init__(self, data, k_num_center):
        self.k_num_center = k_num_center
        self.data = data

    def init_medoids(self,data, k):
        '''
        选取K个簇,返回K个数量中心点
        :param data:
        :param k:
        :return:
        '''
        n = len(data)
        medoids_idx = random.sample(range(n), k)
        return medoids_idx


    # 计算欧式距离
    def euclidean_distance(self,a, b):
        return np.linalg.norm(np.array(a) - np.array(b))

    def run(self):
        Center = self.init_medoids(self.data,self.k_num_center)

        classify_points = [[centroid] for centroid in Center]
        sample_target = []
        for i in range(len(self.data)):
            # 每条数据到所有中心点的距离
            distances = [self.euclidean_distance(i, centroid) for centroid in Center]
            # print(distances)
            cur_level = np.argmin(distances)
            # 每条数据对应的类别
            sample_target.append(cur_level)
            # 统计,方便迭代完成后重新计算中间点
            classify_points[cur_level].append(i)
        new_medoids =self.select_new_medoids(classify_points,self.euclidean_distance)
        return new_medoids,classify_points,sample_target

           # 选出新的簇中心点
    def select_new_medoids(self,classify_points,func_of_dis):
        new_medoids = []
        for points in classify_points:
            distances = [sum([func_of_dis(data[i], data[j]) for j in points]) for i in points]
            new_medoid_index = np.argmin(distances)
            new_medoids.append(points[new_medoid_index])
        return new_medoids
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: k-medoids聚类算法是一种基于中心对象的聚类方法,与k-means算法类似。在Python中,可以使用第三方库如Scikit-learn, Pyclustering等实现k-medoids聚类算法。 例如使用Scikit-learn: ```python from sklearn.cluster import KMedoids import numpy as np # generate data data = np.random.rand(100,2) # create k-medoids model kmedoids = KMedoids(n_clusters=3) # fit model to data kmedoids.fit(data) # predict clusters clusters = kmedoids.predict(data) ``` 使用Pyclustering: ```python from pyclustering.cluster import kmedoids from pyclustering.utils import read_sample # load sample data = read_sample('data_file.txt') # create k-medoids model kmedoids_instance = kmedoids(data, [1, 2, 3]) # run cluster analysis kmedoids_instance.process() # obtain results clusters = kmedoids_instance.get_clusters() medoids = kmedoids_instance.get_medoids() ``` 请注意,在使用上述代码之前,需要确保已安装Scikit-learn和Pyclustering库。 ### 回答2: K-medoids聚类算法是一种基于距离度量的聚类算法,它可以通过将数据点分配到与它们最相似的中心点来划分数据集。和其他的聚类算法相比,k-medoids聚类算法在处理高维数据时更加有效,并且它能够很好地处理噪声数据。 在Python中,实现k-medoids聚类算法的基本步骤如下: 1. 随机选择k个中心点(k是人为设定的,可以根据需求进行调整)。 2. 对于每个数据点,计算它们与k个中心点的距离,并根据距离将它们分配给最近的中心点。 3. 对于每个中心点和它所包含的所有数据点,计算该数据点与其他所有数据点的距离和。选择距离和最小的数据点作为新的中心点。 4. 重复第2、3步骤,直到所有中心点都不再改变或达到预设的最大迭代次数。 下面是一个使用Python实现k-medoids聚类算法的简单例子: ```python import random from sklearn.metrics.pairwise import pairwise_distances def kmedoids(X, k, max_iterations=100): # 1. 随机选择k个中心点 centers = random.sample(range(len(X)), k) for step in range(max_iterations): # 2. 分配数据点到最近的中心点 distances = pairwise_distances(X, X[centers]) labels = distances.argmin(axis=1) # 3. 根据距离和选择新的中心点 for i in range(k): indices = np.where(labels == i)[0] costs = pairwise_distances(X[indices]) new_center = indices[costs.sum(axis=1).argmin()] centers[i] = new_center # 如果所有中心点都不再改变,则结束迭代 if len(set(centers)) == k: break # 返回分类结果和中心点 distances = pairwise_distances(X, X[centers]) labels = distances.argmin(axis=1) return labels, centers ``` 在这个例子中,它使用scikit-learn库中的pairwise_distances函数来计算两个数据点之间的距离。最后它返回一个分类结果和k个中心点。您可以使用这些结果来分析数据集并进行进一步分析。 ### 回答3: K-medoids聚类算法是一种经典的聚类算法,其主要任务是将数据集中的数据点按照某种距离度量准则划分成不同的簇类。在Python环境下,可以使用sklearn.cluster中的KMedoids实现K-medoids聚类算法。 K-medoids聚类算法采用了中心点的概念,即将每个聚类簇中的某个点作为中心点,而不是采用聚类簇的平均值来作为中心点,这样做的好处是可以更加适应数据集中存在离群点的情况。 K-medoids聚类算法的具体实现步骤如下: 1. 随机选择k个点作为初始中心点; 2. 将数据集中的每个数据点分配到与其最近的中心点所在的聚类簇中; 3. 对于每一个聚类簇,从其中选择一个点作为新的中心点,使得该聚类簇内所有点到新中心点的距离最小; 4. 重复步骤2和步骤3,直到新的中心点与旧的中心点相同时停止迭代。 在Python环境中,我们可以使用sklearn.cluster中的KMedoids实现K-medoids聚类算法。其主要参数包括: - n_clusters: 聚类簇的数量; - metric: 用于距离度量的方法; - method: 用于计算中心点的方法。 KMedoids类实例化后,可以使用fit_predict()方法对数据集进行聚类操作,并返回每个数据点所属的簇类编号。 需要注意的是,K-medoids聚类算法的运行时间、结果质量与中心点的选择有关,因此需要多次运行算法并对结果进行评估和比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值