机器学习实战学习笔记(九)K-均值聚类算法

本文介绍了K-均值聚类算法的工作原理、流程,包括如何初始化质心,如何分配数据点,以及如何更新质心。此外,讨论了如何通过后处理提高聚类性能,如调整SSE和考虑局部最优。还提到了二分K-均值算法,以避免陷入局部最小值。最后,展示了如何将K-均值应用到地图上的地理坐标聚类,并提供了实际操作的示例。

PS:该系列数据都可以在图灵社区(点击此链接)中随书下载中下载(如下)
在这里插入图片描述
  聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类,聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好。K-均值(K-means) 聚类算法,之所以称之为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。
  簇识别(cluster identification):簇识别给出聚类结果的含义。假定有一些数据,现在将相似数据归到一起,簇识别会告诉我们这些簇到底都是些什么。聚类与分类的最大不同在于,分类的目标事先巳知,而聚类则不一样。因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类(unsupervised classification )

1 K-均值聚类算法

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

  K-均值是发现给定数据集的k个簇的算法。簇个数k是用户给定的,每一个簇通过其质心(centroid),即簇中所有点的中心来描述。
  工作流程:首先,随机确定k个初始点作为质心。然后将数据集中的每个点分配到一个簇中,具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。这一步完成之后,每个簇的质心更新为该簇所有点的平均值。
  伪代码:

创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
	对数据集中的每个数据点
		对每个质心
			计算质心与数据点之间的距离
		对数据点分配到距其最近的簇
	对每一个簇,计算簇中所有点的均值并将均值作为质心

  创建kMeans.py,将数据集拷贝到该文件目录,编写如下代码并进行测试:

import numpy as np
import matplotlib.pyplot as plt 
import matplotlib

def loadDataSet(fileName):
    dataMat = []
    with open(fileName, 'r') as fileObject:
        for line in fileObject.readlines():
            curLine = line.strip().split('\t')
            fltLine = list(map(float, curLine))
            dataMat.append(fltLine)
    return dataMat

def distEclud(vecA, vecB):
    '''欧几里得距离'''
    return np.sqrt(np.sum(np.power(vecA - vecB, 2)))

def randCent(dataSet, k):
    '''返回k个随机质心'''
    n = np.shape(dataSet)[1]
    centroids = np.mat(np.zeros((k, n)))
    for j in range(n):
        minJ = np.min(dataSet[:, j])
        rangeJ = float(np.max(dataSet[:, j]) - minJ)
        centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1) #k行1列的[0,1)的随机数
    return centroids

def kMeans(dataSet, k, distMeans=distEclud, createCent=randCent):
    '''K-均值聚类算法'''
    m = np.shape(dataSet)[0]
    #簇分配结果矩阵,第一列存储簇索引值,第二列存储误差
    clusterAssment = np.mat(np.zeros((m, 2)))
    centroids = createCent(dataSet, k)
    clusterChanged = True
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            minDist = float('inf'
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值