【数据挖掘】聚类之k-means(转载)

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

1.算法简述

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

k-means是聚类算法中常用的一种,其中k的含义是指有k个cluster。由聚类的定义可知,一个样本应距离其所属cluster的质心是最近的(相较于其他k-1个cluster)。实际上,k-means的本质是最小化目标函数:

x为样本点,c为cluster。为了表示cluster,最简单有效的是取所有样本点平均,即质心(cluster centroid);这便是取名means的来由。

k-means算法流程如下:

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

循环重复直至收敛

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

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

}

代码参考[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

缺点:

  1. k-means是局部最优,因而对初始质心的选取敏感。换句话说,选取不同的初始质心,会导致不同的分类结果(当然包括差的了)。
  2. 选择能达到目标函数最优的k值是非常困难的。

2. Referrence

[1] Peter Harrington, machine learning in action.

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

[3] the top ten algorithm in data mining, CRC Press.

时间: 2024-11-08 19:41:53

【数据挖掘】聚类之k-means(转载)的相关文章

软件——机器学习与Python,聚类,K——means

K-means是一种聚类算法: 这里运用k-means进行31个城市的分类 城市的数据保存在city.txt文件中,内容如下: BJ,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64TianJin,2459.77,495.47,697.33,302.87,284.19,735.97,570.84,305.08HeBei,1495.63,515.90,362.37,285.32,272.95,540.58,364.91,188.63

R语言最优聚类数目k改进kmean聚类算法

原文链接:http://tecdat.cn/?p=7237 在本文中,我们将探讨应用聚类算法(例如k均值和期望最大化)来确定集群的最佳数量时所遇到的问题之一.从数据集本身来看,确定集群数量的最佳值的问题通常不是很清楚.在本文中,我们将介绍几种技术,可用于帮助确定给定数据集的最佳k值.  我们将在当前的R Studio环境中下载数据集: StudentKnowledgeData <-read_csv(“ YourdownloadFolderPath / StudentKnowledgeData.c

机器学习经典算法详解及Python实现--聚类及K均值、二分K-均值聚类算法

摘要 聚类是一种无监督的学习(无监督学习不依赖预先定义的类或带类标记的训练实例),它将相似的对象归到同一个簇中,它是观察式学习,而非示例式的学习,有点像全自动分类.说白了,聚类(clustering)是完全可以按字面意思来理解的--将相同.相似.相近.相关的对象实例聚成一类的过程.机器学习中常见的聚类算法包括 k-Means算法.期望最大化算法(Expectation Maximization,EM,参考"EM算法原理").谱聚类算法(参考机器学习算法复习-谱聚类)以及人工神经网络算法

初识聚类算法:K均值、凝聚层次聚类和DBSCAN

原文地址http://blog.sina.com.cn/s/blog_62186b460101ard2.html 这里只是将比较重要的部分转一下 另外还有一篇关于层次聚类的 http://blog.csdn.net/jwh_bupt/article/details/7685809 聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下

05_无监督学习--聚类模型--K 均值

无监督学习--聚类模型--K 均值0.引入依赖1.数据的加载和预处理2.算法实现3.测试 无监督学习--聚类模型--K 均值 0.引入依赖 import numpy as npimport matplotlib.pyplot as plt # 这里直接 sklearn 里的数据集from sklearn.datasets.samples_generator import make_blobs 1.数据的加载和预处理 x, y = make_blobs(n_samples=100, centers

k means聚类过程

k-means是一种非监督 (从下图0 当中我们可以看到训练数据并没有标签标注类别)的聚类算法 0.initial 1.select centroids randomly 2.assign points 3.update centroids 4.reassign points 5.update centroids 6.reassign points 7.iteration reference: https://www.naftaliharris.com/blog/visualizing-k-me

[数据挖掘] - 聚类算法:K-means算法理解及SparkCore实现

聚类算法是机器学习中的一大重要算法,也是我们掌握机器学习的必须算法,下面对聚类算法中的K-means算法做一个简单的描述: 一.概述 K-means算法属于聚类算法中的直接聚类算法.给定一个对象(或记录)的集合,将这些对象划分为多个组或者“聚簇”,从而使同组内的对象间比较相似而不同组对象间差异比较大:换言之,聚类算法就是将相似的对象放到同一个聚簇中,而将不相似的对象放到不同的聚簇中.由于在聚类过程中不使用到类别标签,所以相似性的概念要基于对象的属性进行定义.应用不同则相似性规则和聚类算法一般不太

聚类算法:K均值、凝聚层次聚类和DBSCAN

聚类分析就仅根据在数据中发现的描述对象及其关系的信息,将数据对象分组(簇).其目标是,组内的对象相互之间是相似的,而不同组中的对象是不同的.组内相似性越大,组间差别越大,聚类就越好. 先介绍下聚类的不同类型,通常有以下几种: (1)层次的与划分的:如果允许簇具有子簇,则我们得到一个层次聚类.层次聚类是嵌套簇的集族,组织成一棵树.划分聚类简单地将数据对象划分成不重叠的子集(簇),使得每个数据对象恰在一个子集中. (2)互斥的.重叠的与模糊的:互斥的指每个对象都指派到单个簇.重叠的或是模糊聚类用来反

聚类算法:K均值

在数据挖掘中,K-Means算法是一种cluster analysis的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 基本K均值:选择K个初始质心,其中K是用户指定的参数,即所期望的簇的个数.每次循环中,每个点被指派到最近的质心,指派到同一个质心的点集构成一个簇.然后,根据指派到簇的点,更新每个簇的质心.重复指派和更新操作,直到质心不发生明显的变化. 为了定义二维空间的数据点之间的"最近"概念,我们使用欧几里得距离的平方,即点A(x1,y1)与点B(x2