K-means聚类算法的代码实现和算法过程的详细分析

K-means聚类算法

1.聚类的了解

  • 聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类。
  • 聚类与分类的最大不同在于,分类的目标事先已知,而聚类则不一样

2.K-均值聚类的算法

  • 优点:容易实现
  • 缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢
  • 适用数据类型:数据型数据

K-均值的算法工作流程:

  1. 随机确定K个初始点作为质心。
  2. 将数据集中在每个点分配到一个簇中(为每个点找距其最近的质心,并将其分配给该质心对应的簇)

K-均值聚类的一般流程:

1.收集数据:使用任意方法。
2.准备数据:需要数值型数据来计算距离,也可以将标称型数据映射 为二值型数据再来用于数据计算
3.分析数据:使用任意方法。
4.训练算法:不使用于无监督学习,即无监督学习没有训练过程。
5.测试算法:应用聚类算法、观察结果。可以使用量化的误差指标如误差平方和来评价算法的结果。
6.使用算法:可以用于所希望的任何应用。通常情况下,簇质心可以代表整个簇的数据来做出决定

K-means的代码实现:

from numpy import *
import matplotlib.pyplot as plt
from sklearn.cluster import  KMeans

def kmeans(dataSet, k):#dataSet样点数,k簇的个数
    sampleNum,col=dataSet.shape#样本数
    cluster=mat(zeros((sampleNum,2)))#m*2的矩阵,2是一个来记录误差,一个来记录最近点的下标
    centroid=zeros((k,col))
    for i in range(k):
        index=int(random.uniform(0,sampleNum))
        centroid[i,:]=dataSet[index,:]
    clusterChaged=True# clusterChaged标志变量
    while clusterChaged:#当聚类不再变化
        clusterChaged=False
        for i in range(sampleNum):
            minDist=sqrt(sum(power(centroid[0,:]-dataSet[i,:],2)))#dataSet[i,:]第i行的所有元素
            minIdex=0
            for j in range(1,k):
                distance=sqrt(sum(power(centroid[j,:]-dataSet[i,:],2)))
                if distance<minDist:
                    minDist=distance
                    minIdex=j#查找最近的质心
            if cluster[i,0]!=minIdex:
                clusterChaged=True
                cluster[i,:]=minIdex,minDist**2#更新质心
        for j in range(k):
            pointsCluter=dataSet[nonzero((cluster[:,0].A==j)[0])]#查找值为K的满足条件点的序号
            centroid[j,:]==mean(pointsCluter,axis=0)#axis=0表示沿矩阵的列方向进行均值计算
            return centroid,cluster
dataSet = [[1, 1], [3, 1], [1, 4], [2, 5], [11, 12], [14, 11], [13, 12], [11, 16], [17, 12], [28, 10],[26, 15], [27, 13], [28, 11], [29, 15]]
dataSet=mat(dataSet)
k=4
centroids, cluster = kmeans(dataSet, k)
sampleNum,col=dataSet.shape
mark=['or','ob','og']

for i in range(sampleNum):
    markIndax=int(cluster[i,0])
    plt.plot(dataSet[i,0],dataSet[i,1],mark[markIndax])

mark=['+r','+b','+g']
for i in range(k):
    plt.plot(centroids[i,0],centroids[i,1],markersize=12)

plt.show()

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值