【机器学习实战-python3】K-均值聚类算法

本文深入探讨了K-均值聚类算法,包括算法原理、伪代码及其实现过程。通过后处理技巧提升聚类性能,如通过SSE评估并调整簇的数量。此外,介绍了二分K-均值算法,该算法能更好地避免局部最优,并通过示例展示了不同k值下的聚类效果。
摘要由CSDN通过智能技术生成

本篇的数据和代码参见:https://github.com/stonycat/ML-in-Action

一、K-均值聚类算法
聚类是一种无监督的学习,它将相似的对象归到同一簇中,类似全自动分类。簇内的对象越相似,聚类的效果越好。K-均值聚类是每个类别簇都是采用簇中所含值的均值计算而成。聚类与分类的区别在于分类前目标已知,而聚类为无监督分类。
K-均值算法的伪代码如下:

创建k个点作为起始质心(通常随机选择)

   当任意一个点的簇分配结果发生改变时:
        对数据集中的每个点:
                对每个质心:
                计算质心与数据点之间的距离
         将数据点分配到距离其最近的簇
    对每一个簇,计算簇中所有点的均值并将均值作为质心。

基本功能函数:加载数据、计算距离、初始化k个中心三个函数。

#coding=utf-8

from numpy import *

#load data
def loadDataSet(fileName):
    dataMat = []
    fr = open(fileName)
    for line in fr.readlines(): #for each line
        curLine = line.strip().split('\t')
        fltLine = list(map(float,curLine)) #这里和书中不同 和上一章一样修改
        dataMat.append(fltLine)
    return dataMat

#distance func
def distEclud(vecA,vecB):
    return sqrt(sum(power(vecA - vecB, 2)))  # la.norm(vecA-vecB) 向量AB的欧式距离

#init K points randomly
def randCent(dataSet, k):
    n = shape(dataSet)[1]
    centroids = mat(zeros((k,n)))#create centroid mat
    for j in range(n):#create random cluster centers, within bounds of each dimension
        minJ = min(dataSet[:,j])
        rangeJ = float(max(dataSet[:,j]) - minJ)
        centroids[:,j] = mat(minJ + rangeJ * random.rand(k,1))
    return centroids

K-均值聚类算法接收4个参数,两个必要参数为数据集和k的值,另外两个为距离计算函数和初始化函数(可修改)。算法采用计算质心-分配-重新计算质心反复迭代的方式,直到所有点的分配结果不再改变。设置flag为clusterChange=True。

#K-均值算法:
def 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值