python实现k-means聚类算法(python实现)

k-means聚类算法是最经典的聚类算法,本文数据采用500二维条数据集
在这里插入图片描述
分为四个类

计算欧式距离模块在这里插入代码片

def getDistance(v1,v2):
    # dis = np.sqrt(np.sum(np.square(v1 - v2)))   #计算两个数据之间的欧式距离
    dis = sqrt(sum(power(v1 - v2,2)))  #v1,v2是两个数据点的坐标 (x1-x2)的平方+(y1-y2)的平方开根号得到距离
    # dis = sqrt(power(v1 - v2, 2))
    return dis

处理数据文件模块

def getDistance(v1,v2):
    # dis = np.sqrt(np.sum(np.square(v1 - v2)))   #计算两个数据之间的欧式距离
    dis = sqrt(sum(power(v1 - v2,2)))  #v1,v2是两个数据点的坐标 (x1-x2)的平方+(y1-y2)的平方开根号得到距离
    # dis = sqrt(power(v1 - v2, 2))
    return dis

初始化质心模块

def innitCentroid(dataSet,k):
    return random.sample(dataSet,k)    #初始化质心

计算每个类别的质心模块

def getCentroid(cenList,cenDiction):   #计算每个类别中的质心
    newcen = list()
    for i in range(len(cenList)):
        newcen.append(mean(array(cenDiction[i]),0).tolist())  #对于每个类别 计算所有坐标的平均值
    print('新的质心',newcen)
    return newcen

计算聚类模块

def minDistance(dataSet,cenList):   #计算最小聚类,获得新的分类
    cenDiction = {}
    for item in dataSet:
        mind = float("inf")  #最大数  表示无穷大数
        flag = 0
        aitem = array(item)    #list类型不能对数据进行运算 所以转换为array类型
        for i in range(len(cenList)):   #对于每个质心 计算每个数据点到质心的距离
            acen = array(cenList[i])
            if getDistance(aitem,acen) < mind:
                mind = getDistance(aitem,acen)
                # print(mind)
                flag = i
        if flag not in cenDiction.keys():   #如果质心不再分类字典的keys()中 加入
            cenDiction[flag] = []
        cenDiction[flag].append(item)
        # print(cenDiction)
    return cenDiction

计算方差模块

def getDeviation(cenList,cenDiction):   #计算均方差
    sum = 0
    for i in range(len(cenList)):
        item = cenList[i]
        aitem = array(item)
        for data in cenDiction[i]:
            adata = array(data)
            sum = sum + getDistance(aitem,adata)
    return sum

显示图片模块

def showplot(cenList,cenDiction,newnum,oldnum):
    colormark = ['or','og','ob','ok','oy','ow']  #o表示圆  d表示菱形
    cenmark = ['dr','dg','db','dk','dy','dw']
    plt.figure('k-means聚类')
    for i in range(len(cenList)):
        plt.plot(cenList[i][0],cenList[i][1],cenmark[i])
        for item in cenDiction[i]:
            plt.plot(item[0],item[1],colormark[i])
    if abs(newnum - oldnum) < 0.0001:
        plt.savefig("k-means.png")
    plt.show()

第一次迭代
第一次迭代效果图
新的质心 [[-6.3204742186881715, -9.315093760527636], [-5.686493501230958, 0.34266093128677], [-6.632153415413944, -4.653307380704366], [-7.431619373196795, -8.30175325544197]]
第二次迭代效果图
第二次迭代效果图
新的质心 [[-6.1893099419358695, -9.006325255392968], [-2.08113110707828, 3.6587271216146133], [-8.17711209582964, -3.6407743206173073], [-7.696088659673251, -7.691135694294057]]

不断的迭代下去
得到最后结果
控制台得到的结果
最后迭代的效果图
从上图的结果看出,划分为三个类比较好,效果如下:
划分为三个类的聚类效果
需要源码和数据的朋友,下载链接如下:
源码和数据下载链接

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ChengXuxiao

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值