K-means均值聚类算法python代码实现

本文详细介绍了一次K-means聚类算法的实际应用过程。通过导入必要的Python库,如numpy、matplotlib、pandas等,从CSV文件中读取数据,并将其转换为列表形式。接着,利用随机初始化的方式设置聚类中心,进行迭代计算直至收敛,最终实现了数据的聚类分析。通过绘制原始数据散点图和聚类结果图,直观展示了K-means算法的效果。
摘要由CSDN通过智能技术生成
import numpy as np
import matplotlib.pyplot as plt
import math
import random
import pandas as pd
data=pd.read_csv("svm.csv")
kdataList=data.values.tolist()  #把DataFrame解析成列表
fig=plt.figure()
ax=fig.add_subplot(121)
ax.scatter(data["factor1"],data["factor2"]) #原始数据散点图
plt.title("Origin Data")
listData0=[]
listData1=[]
listData2=[]
listU=[]
listULast=[]
dis=[]
k=3   #簇个数
data=data.values
center=np.zeros((k,np.shape(data)[1]))
for i in range(k):
    for j in range(np.shape(data)[1]):
        minI=min(data[:,j])
        rangeI=float(max(data[:,j])-minI)
        center[i][j]=random.random()*rangeI+minI
listU=center.tolist()
while True:
    if listULast!=listU:
        for i in range(30):
            for j in range(3):
               dis.append(math.sqrt(pow(kdataList[i][0]-listU[j][0],2)+pow(kdataList[i][1]-listU[j][1],2))) #计算样本点与均值向量的距离
            minDis = dis[0]
            disIndex=0
            for m in range(1,3):
                if dis[m]<minDis:
                    minDis=dis[m]
                    disIndex=m
            if disIndex==0:
                listData0.append(kdataList[i])
            elif disIndex==1:
                listData1.append(kdataList[i])
            else:
                listData2.append(kdataList[i])
            dis=[]
        listULast = listU
        listU=[]
        npData0=np.matrix(listData0)
        npData1=np.matrix(listData1)
        npData2=np.matrix(listData2)
        listData0=[]
        listData1=[]
        listData2=[]
        u0=np.mean(npData0,axis=0).tolist()[0]
        if listULast[0]!=u0[0]:
            listU.append(u0)
        else:
            listU.append(listULast[0])
        u1=np.mean(npData1,axis=0).tolist()[0]
        if listULast[1]!=u1[0]:
            listU.append(u1)
        else:
            listU.append(listULast[1])
        u2=np.mean(npData2,axis=0).tolist()[0]
        if listULast[2]!=u2[0]:
            listU.append(u2)
        else:
            listU.append(listULast[2])
    else:
        break
finalList0=npData0.tolist()
finalList1=npData1.tolist()
finalList2=npData2.tolist()
ax1=fig.add_subplot(122)
for i in range(len(finalList0)):
    ax1.scatter(finalList0[i][0],finalList0[i][1],c='b',marker='^')
for i in range(len(finalList1)):
    ax1.scatter(finalList1[i][0],finalList1[i][1],c='r',marker='o')
for i in range(len(finalList2)):
    ax1.scatter(finalList2[i][0],finalList2[i][1],c='k',marker='s')
for i in range(len(listU)):
    ax1.scatter(listU[i][0],listU[i][1],marker='+',c='k',s=200)
plt.title("K-means Clustering")
plt.show()

以下是运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值