数据挖掘十大经典算法之二:K-means

概念和原理

k-means是无监督聚类算法,主要是根据样本的相似度或者样本之间的距离进行自动分类。
首先,初始化聚类中心,可以随机选择K个样本,也可以固定选择其中的k个样本作为初始化的聚类中心。
其次,计算各样本到所有的聚类中心的相似度(此处用距离表示),将样本分到与聚类中心相似的最大即距离最小的中心所在的类中。
再次,更新聚类中心,可以通过样本的平均值计算
最后,循环迭代,直至满足停止条件。

Code

import numpy as np
from operator import itemgetter

def loadData(filename):
    dataset = []
    file = open(filename)
    for line in file.readlines():
        dataset.append(map(float,line.strip().split('\t')))
    return np.array(dataset)

def computeDistence(dataset,centre):
    return np.sqrt(((dataset-centre)**2).sum(axis=1))

def computeCentre(dataset,k):
    n = dataset.shape[1]
    centreSet = np.zeros((k,n))
    minvalue = dataset.min(axis=0)
    maxvalue = dataset.max(axis=0)
    chageRange = maxvalue-minvalue
    centreSet = minvalue + chageRange*np.random.rand(k,2)
    return centreSet

def kmeans(dataset,k):
    m = dataset.shape[0]
    clusterResult = np.zeros((m,3))
    centres =computeCentre(dataset,k)
    clusterChanged = True
    while clusterChanged:
        clusterChanged=False
        for i in range(m):
            distence = computeDistence(dataset[i],centres)
            indexes, sortedDistence = zip(*sorted(enumerate(distence), key=itemgetter(1)))
            if(clusterResult[i,1] !=indexes[0]):
                clusterChanged = True
            clusterResult[i,:] = i,indexes[0],sortedDistence[0]
        for i in range(k):
            tmp = dataset[np.array((clusterResult[clusterResult[:,1] == i])[:,0]).astype(np.int32)]
            meanvalue = np.mean(tmp,axis=0)
            centres[i,:] = np.mean(tmp,axis=0)
    return centres,clusterResult

def main():
    dataset = loadData('testSet.txt')
    centres = computeCentre(dataset,4)
    centres,clusterResult = kmeans(dataset,4)

if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值