用numpy和不用numpy的kmeans算法的效率对比

这篇博客对比了使用numpy库和不使用numpy库实现的k-means聚类算法的效率。在随机生成1000个点并选择5个作为中心点的情况下,通过计算距离并迭代更新聚类中心,评估了两种实现方式的性能。实验结果显示,由于随机数生成的影响,两种方法的效率有时会互换,但总体上numpy版本在某些情况下能展现出更高的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前写过一篇kmeans算法的博客,没有用numpy,可视化也不完美,今天来对比一下numpy对kmeans的影响

kemans算法

定义

k均值聚类算法是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

方法

1.随机取1000个点,其中随机5个为中心点
2.求其余995个点与每个中心点的距离
3.距离最小的,将此点和对应的中心点归为一类
4.类中求平均值作为新的中心点
5.如果新中心点和旧中心点的误差小于某个阈值,停止,否则重复以上操作

代码实现

#引入需要的模块
import numpy as np
import matplotlib.pyplot as plt
import random
import time     #检验效率,时间少的效率高

figure = plt.figure()
#用numpy的方法
subplot1 = figure.add_subplot(1,2,1)
class KMeans():
    def __init__(self, k=1):
        '''
        :param k: k代表分类数
        '''
        self.__k = k
        self.__data = None         # 存放原始数据
        self.__pointCenter = None  # 存放中心点,第一次获得的中心点通过随机方式在__data里随机出来
        self.__result = []       # 存放分类结果
        for i in range(k):
            self.__result.append([])  # [[],[],[],[],[]]
            pass
        pass
    def fit(self, data, threshold, times=50000):
        '''
        进行模型训练
        :param data: 训练数据
        :param threshold: 阈值,退出条件
        :return:
        '''
        self.__data = data
        self.randomCenter()
        # print(self.__pointCenter)
        centerDistance = self.calPointCenterDistance(self.__pointCenter, self.__data)

        # 对原始数据进行分类,将每个点分到离它最近的中心点
        i = 0
        for temp in centerDistance:
            index = np.argmin(temp)
            self.__result[index].append(self.__data[i])
            i += 1
            pass
        # 打印分类结果
        # print(self.__result)
        oldCenterPoint = self.__pointCenter
        newCenterPoint = self.calNewPointCenter(self.__result)
        while np.sum(np.sum((oldCenterPoint -  newCenterPoint)**2, axis=1)**0.5)/self.__k > threshold:
            times -= 1
            result = []
            for i in range(self
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值