首页 > 其他 > 详细

【数据挖掘】聚类之k-means

时间:2014-04-19 03:48:01      阅读:582      评论:0      收藏:0      [点我收藏+]

1.算法简述


分类是指分类器(classifier)根据已标注类别的训练集,通过训练可以对未知类别的样本进行分类。分类被称为监督学习(supervised learning)。如果训练集的样本没有标注类别,那么就需要用到聚类。聚类是把相似的样本聚成一类,这种相似性通常以距离来度量。聚类被称为无监督学习(unspervised learning)。


k-means是聚类算法中常用的一种,其中k的含义是指有k个cluster。在k-means中,用质心表示cluster,如果一个样本属于某个cluster,则该样本距离这个cluster是最近的(相较于其余k-1质心)。


k-means算法流程如下:

选取初始k个质心(通常随机选取)

循环重复直至收敛

{    对每个样本,计算出与k个质心距离最近的那个,将其归为距离最新质心所对应的cluster

    重新计算质心,当质心不再变化即为收敛

}


数学表述:

bubuko.com,布布扣


代码参考[1,2],结果可视化请参考[2]

import numpy as np
import scipy.spatial.distance as ssd
import matplotlib.pyplot as plt 

def read_file(fn):
    raw_file=open(fn)
    dataSet=[]
    for raw_row in raw_file.readlines():
        row=raw_row.strip().split(‘\t‘)
        dataSet.append((float(row[0]),float(row[1])))

    return np.array(dataSet)

def firstCentroids(k,dataSet):
    """create the first centroids"""

    num_columns=dataSet.shape[1]
    centroids=np.zeros((k,num_columns))
    for j in range(num_columns):
        minJ=min(dataSet[:,j])
        rangeJ=max(dataSet[:,j])-minJ
        for i in range(k):
            centroids[i,j]=minJ+rangeJ*np.random.uniform(0,1)
    return np.array(centroids)

def kmeans(k,dataSet):
    num_rows,num_columns=dataSet.shape
    centroids=firstCentroids(k,dataSet)
    
    #store the cluster that the samples belong to
    clusterAssment=np.zeros((num_rows,2))
    clusterChanged=True
    while clusterChanged:
        clusterChanged=False
       
        #find the closet centroid
        for i in range(num_rows):
            minDis=np.inf;minIndex=-1
            for j in range(k):
                distance=ssd.euclidean(dataSet[i,:],centroids[j,:])
                if distance<minDis:
                    minDis=distance;minIndex=j

            if(clusterAssment[i,0]!=minIndex): clusterChanged=True
            clusterAssment[i,:]=minIndex,minDis**2
        
        #update the centroid location
        for cent in range(k):
            ptsInCent=dataSet[np.nonzero(clusterAssment[:,0]==cent)[0]]
            centroids[cent,:]=np.mean(ptsInCent,axis=0)

    return centroids,clusterAssment

2. Referrence


[1] Peter Harrington, machine learning in action.

[2] zouxy09, 机器学习算法与Python实践之(五)k均值聚类(k-means).

    





【数据挖掘】聚类之k-means,布布扣,bubuko.com

【数据挖掘】聚类之k-means

原文:http://blog.csdn.net/keyboardlabourer/article/details/24045789

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!