非监督学习算法K均值(K-Means)探讨

本文深入探讨了K均值算法,从基础介绍到实现过程,再到改进版的二分K均值算法。通过Python实现并可视化,展示算法如何逐步划分数据点。此外,还介绍了Sklearn库中的K-Means实现,强调其通过多次运行寻找全局最优解的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. K均值算法介绍及实现

K均值算法(K-means)是无监督学习中的一种,其算法简洁容易实现,且Sklearn包中也提供了相应的模块可以直接调用。在<<机器学习实战>>书中,也对该算法进行了介绍。

常规的K-means算法在<<机器学习实战>>书中介绍如下:

k 均值 是 发现 给定 数据 集 的 k 个 簇 的 算法。 簇 个数 k 是 用户 给定 的, 每一个 簇 通过 其 质 心( centroid), 即 簇 中 所 有点 的 中心 来 描述。

下图是一个典型的例子。给定一个原始数据集(未标注的数据点的集合),通过K均值算法,可以给出哪些数据点是“相互靠的更近”而可以被归为一类(簇)的。同时也可以计算出各个类别的“中心点”,即质心。注意,“相互靠的更近”的定义,可以自己来规定,不一定要局限于数据点的几何距离。

不过该算法需要预先指定质心的数量。当然我们的目标应该是用尽可能少的质心,来更好的分隔数据点。
这里写图片描述

其伪代码如下:

*: k为最终簇(也即质心)的数量

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

该伪代码的python实现已经由《机器学习实战》一书给出。下下面的代码额外加上了使用matplot绘的函数,以便将结果可视化。

from numpy import *
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

def loadDataSet(fileName):      
    '''
    @fun: 载入文件,并将文件里的数据转化为float型
    @input: fileName --- 文件地址
    @return: list型的数据
    注意:这里的文件是原始数据集。每一行对应了一个点。每一行有两个数据,第一个为x坐标,第二个为y坐标。两个数据由Tab分开
    '''
    dataMat = []               
    fr = open(fileName)
    for line in fr.readlines():
        curLine = line.strip().split('\t') #按tab来分隔数据
        fltLine = list(map(float,curLine))
        dataMat.append(fltLine)
    return dataMat

def distEclud(vecA, vecB):
    #计算两个向量的欧式公式。将每个向量看成一个点。
    return sqrt(sum(power(vecA - vecB, 2)))

def randCent(dataSet, k):
    '''
    @fun: 产生K个随机的质心
    @input: dataSet --- 数据集
            k --- 随机质心的数量
    @return: matrix. 每一行为一个随机质心的坐标向量
    '''
    n = shape(dataSet)[1]
    centroids = mat(zeros((k,n)))
    for j in range(n):
        minJ = min(dataSet[:,j]) 
        maxJ=max((dataSet[:,j]))
        rangeJ= float(maxJ- minJ)
        centroids[:,j] = mat(minJ + rangeJ * rando
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值