论文代码实现——k-means_python

这篇博客介绍了如何使用贪心算法来确定k-means聚类的初始中心点,以及通过Python实现k-means聚类的过程。博主展示了如何计算欧几里得距离,并提供了k-means算法的完整代码,包括数据预处理、聚类过程和结果展示。此外,还探讨了肘部法则作为选择最佳k值的方法,并给出了相应的代码示例。

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

首先分割数据集,然后k-means聚类。论文中对于k-means获取k,用的是贪心算法。第一个点是随机获取的,第二个中心点是根据第一个点获取的,这就导致获取的k可能不是最优的。

先用论文中的方式,贪心算法


import random
import numpy as np


# 计算欧几里得距离
def distEclud(x, y):
    #强制类型转换,list转array
    a=np.array(x, dtype = float)
    b=np.array(y, dtype = float)
    dis=np.sqrt(np.sum(np.square(a - b)))
    return dis

def getcNumAndCenter(data,m):
    #簇中心
    centers=[]
    #随机选择第一个簇中心
    c1=random.choice(data)
    centers.append(c1)
    #根据第一个簇中心找第二个
    maxdis=-1
    for c in data:
        dis=distEclud(c,c1)
        if maxdis<dis :
            c2=c.copy()
    centers.append(c2)
    number=2

    for xi in data:
        #xi到每个中心点的距离,xi != cj        
        mindis=9999999
        flag=0
        sumDis=0.0
        for cj in centers:
            if xi is not cj:
                flag=1
                #计算距离
                dis=distEclud(xi,cj)
                if mindis > dis:
                    mindis =dis #找最小的距离
                #求cj与ck之间的平均距离,这里只计算c1到各个点之间的距离
                if c1 is not cj:
                    dis2=distEclud(c1,cj)
                    sumDis+=dis2
        if flag:
            centersNum=float(len(centers))
            avgdis =float(sumDis/centersNum)
            if mindis >avgdis and number<m :
            &

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值