kmenas及其改进算法(python和matlab实现)

本文介绍了KMeans聚类算法,包括其优缺点,并指出在未知类别数量时的适用场景。文章提供了Python和MATLAB的实现代码,并通过结果展示解释了如何确定最佳分类数量。
摘要由CSDN通过智能技术生成

December 13, 2015 6:45 PM

  聚类分析是一种静态数据分析方法,常被用于机器学习,模式识别,数据挖掘等领域。通常认为,聚类是一种无监督式的机器学习方法,它的过程是这样的:在未知样本类别的情况下,通过计算样本彼此间的距离(欧式距离,马式距离,汉明距离,余弦距离等)来估计样本所属类别。从结构性来划分,聚类方法分为自上而下和自下而上两种方法,前者的算法是先把所有样本视为一类,然后不断从这个大类中分离出小类,直到不能再分为止;后者则相反,首先所有样本自成一类,然后不断两两合并,直到最终形成几个大类。
  Kmeans聚类是一种自下而上的聚类方法,它的优点是简单、速度快;缺点是聚类结果与初始中心的选择有关系,且必须提供聚类的数目。Kmeans的第二个缺点是致命的,因为在有些时候,我们不知道样本集将要聚成多少个类别,这种时候kmeans是不适合的,推荐使用hierarchical 或meanshift来聚类。第一个缺点可以通过多次聚类取最佳结果来解决。
  Kmeans的计算过程大概表示如下随机选择k个聚类中心. 最终的类别个数<= k计算每个样本到各个中心的距离每个样本聚类到离它最近的中心重新计算每个新类的中心重复以上步骤直到满足收敛要求。(通常就是中心点不再改变或满足一定迭代次数)。
以下为分别用python和matlab实现的代码,供大家学习和讨论。
python版本:

#Kmeans.py
#2015.11.08
#Email:wyxidian@gmail.com

from pylab import *

#Display the Chinese
rcParams['font.sans-serif'] = ['SimHei']
rcParams['axes.unicode_minus'] = False


kRange = range(2, 7)#data set of the possible k value,k is the number of class
Length = 500#length of data
x = zeros(Length)
y = zeros(Length)

#Generate date
x[0:100] = randn(1,100)+1
y[0:100] = randn(1,100)+1
x[100:200] = randn(1,100)+6
y[100:200] = randn(1,100)-2
x[200:500] = randn(1,300)+5
y[200:500] = randn(1,300)+10
varResult = zeros(len(kRange))


figure()
plot(x,y,'o')
title('Orignal Data')

#try every possible value of k to classify the data
for k in  kRange:
    #Initial
    Center_x = zeros(k)
    Center_y = zeros(k)
    Center_x[0] = randn()
    Center_y[0] = randn()
    Last_Center_x = zeros(k)
    Last_Center_y = zeros(k)
    Sum_x = zeros(k)
    Sum_y = zeros(k)
    Num = zeros(k)
    index = zeros(Length)
    distance = zeros(k)
    distCenter = zeros(Length)
    #Chose the initial Center_x and Center_y
    for i in range(1,k):
        for idxDate in range(Length):
            distCenter[idxDate] = (Center_x[i-1] - x[idxDate])**2 + (Center_y[i-1] - y[idxDate])**2
        sumDisCenter = sum(distCenter)
        randDis = randint(0,sumDisCenter)
        idx = 0
        while randDis-distCenter[idx] > 0:
            randDis = randDis-distCenter[idx]
  
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值