数学推导+纯Python实现机器学习算法25:kmeans聚类

机器学习强基计划7-2:图文详解K-均值聚类(K-means)算法(附Python实现)_python kmeans算法图解 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理;“广”在分析多个机器学习模型:决策树、支持向量机、贝叶斯与马尔科夫决策、强化学习等。强基计划实现从理论到实践的全面覆盖,由本人亲自从底层编写、测试与文章配套的各个经典算法,不依赖于现有库,可以大大加深对算法的理解。机器学习强基计划(附几十种经典模型源码)自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 阅读详情

Python机器学习算法实现

Author:louwill

Machine Learning Lab

     

聚类分析(Cluster Analysis)是一类经典的无监督学习算法。在给定样本的情况下,聚类分析通过特征相似性或者距离的度量方法,将其自动划分到若干个类别中。常用的聚类分析方法包括层次聚类法(Hierarchical Clustering)、k均值聚类(K-means Clustering)、模糊聚类(Fuzzy Clustering)以及密度聚类(Density Clustering)等。本节我们仅对最常用的kmeans算法进行讲解。

相似度度量

相似度或距离度量是聚类分析的核心概念。常用的距离度量方式包括闵氏距离和马氏距离,常用的相似度度量方式包括相关系数和夹角余弦等。

  • 闵氏距离
    闵氏距离即闵可夫斯基距离(Minkowski Distance),定义如下。给定维向量样本集合,对于,,,样本与样本之间的闵氏距离可定义为:
    ,
    当时,闵氏距离就可以表达为欧式距离(Euclidean Distance):

    当时,闵氏距离也称为曼哈顿距离(Manhatan Distance):

    当时,闵氏距离也称为切比雪夫距离(Chebyshev Distance):

  • 马氏距离
    马氏距离全称为马哈拉诺比斯距离(Mahalanobis Distance),即一种考虑各个特征之间相关性的聚类度量方式。给定一个样本集合,其协方差矩阵为,样本与样本之间的马氏距离可定义为:

    当为单位矩阵时,即样本的各特征之间相互独立且方差为1时,马氏距离就是欧式距离。

  • 相关系数
    相关系数(Correlation Coefficent)是度量相似度最常用的方式。相关系数越接近于1表示两个样本越相似,相关系数越接近于0,表示两个样本越不相似。样本和之间相关系数可定义为:

  • 夹角余弦
    夹角余弦也是度量两个样本相似度的方式之一。夹角余弦越接近于1表示两个样本越相似,夹角余弦越接近于0,表示两个样本越不相似。样本和之间夹角余弦可定义为:

kmeans聚类

kmeans即k均值聚类算法。给定维样本集合,均值聚类是要将个样本划分到个不同的类别区域,通常而言。所以均值聚类可以总结为对样本集合的划分,其学习策略主要是通过损失函数最小化来选取最优的划分。

我们使用欧式距离作为样本间距离的度量方式。则样本间的距离可定义为:

定义样本与其所属类中心之间的距离总和为最终损失函数:

其中为第个类的质心(即中心点),中表示指示函数,取值为1或0。函数表示相同类中样本的相似程度。所以均值聚类可以规约为一个优化问题求解:



该问题是一个NP hard的组合优化问题,实际求解时我们采用迭代的方法进行求解。

根据以上定义,我们可以梳理均值聚类算法的主要流程如下:

  • 初始化质心。即在第0次迭代时随机选择个样本点作为初始化的聚类质心点。

  • 按照样本与中心的距离对样本进行聚类。对固定的类中心,其中为类的中心点,计算每个样本到类中心的距离,将每个样本指派到与其最近的中心点所在的类,构成初步的聚类结果。

  • 计算上一步聚类结果的新的类中心。对聚类结果计算当前各个类中样本均值,并作为新的类中心。

  • 如果迭代收敛或者满足迭代停止条件,则输出最后聚类结果,否则令,返回第二步重新计算。

kmeans算法实现

下面我们基于numpy按照前述算法流程来实现一个kmeans算法。回顾上述过程,我们可以先思考一下对算法每个流程该如何定义。首先要定义欧式距离计算函数,然后类中心初始化、根据样本与类中心的欧式距离划分类别并获取聚类结果、根据新的聚类结果重新计算类中心点、重新聚类直到满足停止条件。

下面我们先定义两个向量之间的欧式距离函数如下:

import numpy as np
# 定义欧式距离
def euclidean_distance(x1, x2):
    distance = 0
    # 距离的平方项再开根号
    for i in range(len(x1)):
        distance += pow((x1[i] - x2[i]), 2)
    return np.sqrt(distance)

然后为每个类别随机选择样本进行类中心初始化:

# 定义中心初始化函数
def centroids_init(k, X):
    n_samples, n_features = X.shape
    centroids = np.zeros((k, n_features))
    for i in range(k):
        # 每一次循环随机选择一个类别中心
        centroid = X[np.random.choice(range(n_samples))]
        centroids[i] = centroid
    return centroids

根据欧式距离计算每个样本所属最近类中心点的索引:

# 定义样本的最近质心点所属的类别索引
def closest_centroid(sample, centroids):
    closest_i = 0
    closest_dist = float('inf')
    for i, centroid in enumerate(centroids):
        # 根据欧式距离判断,选择最小距离的中心点所属类别
        distance = euclidean_distance(sample, centroid)
        if distance < closest_dist:
            closest_i = i
            closest_dist = distance
    return closest_i

定义构建每个样本所属类别过程如下:

# 定义构建类别过程
def create_clusters(centroids, k, X):
    n_samples = np.shape(X)[0]
    clusters = [[] for _ in range(k)]
    for sample_i, sample in enumerate(X):
        # 将样本划分到最近的类别区域
        centroid_i = closest_centroid(sample, centroids)
        clusters[centroid_i].append(sample_i)
    return clusters

根据上一步聚类结果重新计算每个类别的均值中心点:

# 根据上一步聚类结果计算新的中心点
def calculate_centroids(clusters, k, X):
    n_features = np.shape(X)[1]
    centroids = np.zeros((k, n_features))
    # 以当前每个类样本的均值为新的中心点
    for i, cluster in enumerate(clusters):
        centroid = np.mean(X[cluster], axis=0)
        centroids[i] = centroid
    return centroids

然后简单定义一下如何获取每个样本所属的类别标签:

# 获取每个样本所属的聚类类别
def get_cluster_labels(clusters, X):
    y_pred = np.zeros(np.shape(X)[0])
    for cluster_i, cluster in enumerate(clusters):
        for sample_i in cluster:
            y_pred[sample_i] = cluster_i
    return y_pred

最后我们将上述过程进行封装,定义一个完整的kmeans算法流程:

# 根据上述各流程定义kmeans算法流程
def kmeans(X, k, max_iterations):
    # 1.初始化中心点
    centroids = centroids_init(k, X)
    # 遍历迭代求解
    for _ in range(max_iterations):
        # 2.根据当前中心点进行聚类
        clusters = create_clusters(centroids, k, X)
        # 保存当前中心点
        prev_centroids = centroids
        # 3.根据聚类结果计算新的中心点
        centroids = calculate_centroids(clusters, k, X)
        # 4.设定收敛条件为中心点是否发生变化
        diff = centroids - prev_centroids
        if not diff.any():
            break
    # 返回最终的聚类标签
    return get_cluster_labels(clusters, X)

我们来简单测试一下上述实现的kmeans算法:

# 测试数据
X = np.array([[0,2],[0,0],[1,0],[5,0],[5,2]])
# 设定聚类类别为2个,最大迭代次数为10次
labels = kmeans(X, 2, 10)
# 打印每个样本所属的类别标签
print(labels)
[0. 0. 0. 1. 1.]

可以看到,kmeans算法将第1~3个样本聚为一类,第4~5个样本聚为一类。sklearn中也为我们提供了kmeans算法的接口,尝试用sklearn的kmeans接口来测试一下该数据:

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)
print(kmeans.labels_)
[0. 0. 0. 1. 1.]

可以看到sklearn的聚类结果和我们自定义的kmeans算法是一样的。但是这里有必要说明的一点是,不同的初始化中心点的选择对最终结果有较大影响,自定义的kmeans算法和sklearn算法计算出来的结果一致本身也有一定的偶然性。另外聚类类别k的选择也需要通过一定程度上的实验才能确定。

参考资料:

李航 统计学习方法 第二版

Kmeans聚类算法原理与Python实战指南 聚类分析作为无监督学习的核心技术,通过计算样本间相似度实现数据自动分群。Kmeans算法采用迭代优化策略,通过最小化簇内平方误差寻找最优划分,其核心在于距离度量(常用欧式距离)和质心更新机制。该算法在用户分群、图像压缩等领域展现工程价值,配合轮廓系数等评估指标可量化聚类效果。针对电商场景,Kmeans能有效识别高价值用户群体;在图像处理中,通过RGB像素聚类可实现10倍压缩率。实践中需注意数据标准化、K值选择和初始化策略(推荐Kmeans++),大数据场景可采用MiniBatchKMeans优化性能。 阅读详情

相关推荐

机器学习强基计划7-2:图文详解K-均值聚类(K-means)算法(附Python实现)

聚类的基本思路是通过对无标记训练样本的学习来揭示数据内在的聚合性质与规律。本文介绍K均值聚类(K-means)的核心原理、算法流程,并附上Python实现与可视化加深理解

FRIGIDWINTER的博客 4673

聚类 python_kmeans算法用Python怎么实现啊?

虽然有人讲过了,但还是记录一下吧直接用sklean写的话,官网的Python例子是这样的:>>>from sklearn.cluster import KMeans>>> import numpy as np>>> X = np.array([[1, 2], [1, 4], [1, 0],... [4, 2], [4, 4], [4, 0]])>>> kmeans = ...

weixin_39969881的博客 364

白话机器学习算法理论+实战之EM聚类

1. 写在前面 如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,比如我之前写过的一篇十大机器学习算法的小总结,在这简单的先捋一捋, 常见的机器学习算法: 监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等 无监督算法:聚类,降维,关联规则, PageRank等 为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机...

Miracle8070 3909

kmeans聚类算法python实例

KMeans 聚类算法是一种基于距离的聚类算法,用于将数据点分成若干组。在 Python 中,可以使用 scikit-learn 库中的 KMeans 函数来实现 KMeans 聚类算法。 以下是一个 Python 实现 KMeans 聚类算法的示例: from sklearn.cluster import KMeans import numpy as np # 模拟数据 X = np.arra...

weixin_42607969的博客 530

KMeans 聚类 (KMeans Clustering)

K-Means 聚类 (K-Means Clustering) 作者:禅与计算机程序设计艺术 / Zen and the Art of Computer Programming 1. 背景介绍 1.1 问题的由来

AI架构师小马 1513

PyCharm配置WSL开发环境保姆级教程:从安装Conda到项目依赖一键搞定

本文提供PyCharm配置WSL开发环境的完整教程,涵盖从安装Conda到项目依赖管理的全流程。详细介绍了WSL2环境准备、Conda环境配置、PyCharm远程解释器设置等关键步骤,并包含实用技巧和常见问题解决方案,帮助开发者高效搭建Python开发环境。

weixin_42620202的博客 309

【机器学习】Kmeans聚类(含代码)

KMeans算法思想

littlemichelle 2万+

基于verilog实现AXI4协议接口读写功能

AXI4是ARM公司推出的第四代AMBA总线协议,专为高带宽、低延迟的片上通信设计,广泛应用于FPGA、处理器及DSP等复杂系统,AXI4包含三中形态,分别为AXI4:标准版本,支持高带宽内存映射通信。AXI4-Lite:简化版,用于寄存器等简单设备的轻量级访问。AXI4-Stream:无地址协议,适用于高速数据流传输(如视频、音频)。本文章主要介绍AXI4协议的代码实现1. 写地址通道定义2. 写数据通道定义3. 写响应通道定义4. 读地址通道定义5. 读数据通道定义。

junpingc的博客 628

K-Means 聚类算法

这里写自定义目录标题1 概念2 算法介绍3 初始中心点的选择4 源码测试参考 1 概念 聚类算法试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集称为一个簇(cluster),通过划分,每个簇都可能对应于一些潜在的概念或类别(例如动态对象) 2 算法介绍 K-Means 算法中的 K 表示聚类为 K 个簇,Means 代表取该簇中数据值的均值作为该簇的中心,或者称为质心,即用每一个的集合的质心对该簇进行描述。 算法步骤为:先随机选取 K 个中心点作为簇中心,并计算所有样本数据与这 K

qq_52382976的博客 2799

工控上位机开发学习路线与核心技术解析

工控上位机开发是工业自动化领域的关键技术,通过计算机软件实现对工业设备的监控与控制。其核心在于掌握工业通信协议(如Modbus、OPC UA)、数据处理算法和可视化开发三大能力。上位机系统需要高效解析设备通信协议,处理实时数据,并提供直观的人机交互界面。在智能制造浪潮下,掌握C#语言和工业协议开发能力成为工程师的核心竞争力。典型应用场景包括生产线监控、设备远程运维等。本文基于工业现场实践经验,详解从协议解析到界面优化的全链路开发要点,特别针对Modbus协议调优、WPF性能优化等高频问题提供解决方案。

weixin_30376083的博客 552

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

天天酷科研的博客 1114

kmeans算法_KMeans聚类算法详解

1. 写在前面如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法:监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等无监督算法:聚类,降维,关联规则, PageRank等为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些机器学习的课程,但总感觉话语里比较深奥,读起...

weixin_39824223的博客 5204

UG NX二次开发(C#)-VS2022配置NX二次开发模板不能正常显示的问题

随着VS2022的发布,使用VS2022进行UG NX二次开发的人员也会越来越多,但是由于VS2022和以前的VS版本采用代码结构不同,而UG NX的二次开发编程模板还没有适应于VS2022的模板配置,所以不能正常的创建一个完整的工程。本文采用曲线救国的方式来实现VS2022下的UG NX二次开发。如果有读者能很好的解决模板配置,不吝赐教。

GimiGimmy 4277

机器学习之Kmeans算法推导(EM算法)以及python实现

pass

hongwei的博客 2482

ENS160传感器原理图设计,已量产(空气质量传感器)

ENS160 是一款集成式数字空气质量传感器,核心优势源于 “MEMS 传感元件 + 内置微处理器” 的架构。

不脱发的程序猿 575

【YOLOv11多模态涨点改进】独家创新首发| TGRS 2026 |引入 CIFusion 通道交互融合模块,通过跨特征交互机制强化目标区域响应,适合多模态融合目标检测,小目标检测高效涨点

🔥本文提出了一种改进YOLOv11多模态目标检测模型的方法,通过引入CIFusion通道交互融合模块来提升RGB与红外特征融合效果。CIF模块采用通道级自适应交互机制,根据全局上下文动态分配不同模态通道的重要性,实现跨模态特征交互与互补信息融合。相比传统拼接或加权融合方式,CIF能够增强目标区域响应,抑制背景噪声,提高小目标和低对比度目标的检测性能。实验表明,该方法在DroneVehicle等数据集上显著提升了检测精度。论文还详细介绍了CIF模块的结构原理、实现代码及模型配置方法。

Ai缝合怪、助力小伙伴高效发论文 187

详解Kmeans聚类算法:原理、实现与应用

本文全面介绍了K-means聚类算法,包括其核心概念、算法原理和数学推导。K-means通过迭代划分样本到最近的簇并更新簇中心实现聚类,采用欧氏距离作为相似度度量,以最小化簇内平方和为目标函数。文章详细讲解了传统K-means的初始化问题及K-means++改进方案,通过Python手动实现和sklearn库实现展示了算法应用,并介绍了肘部法则和轮廓系数两种选择最优K值的方法。最后分析了K-means的优缺点及其在用户分群、图像分割等场景的应用,同时指出其局限性并建议后续学习改进算法。该文适合机器学习初学者

m0_69585895的博客 3848

STM32 实现 4*4 矩阵键盘扫描(HAL库、标准库 都适用)

本文实现的代码是基于STM32HAL库的基础上的,不过标准库也可以用,只是调用的库函数不同,逻辑跟配置是一样的,按我这里的逻辑来配置即可。 1、键盘原理图: 原理举例:先把 F0-F7 内部拉高,这样这个8个引脚都是高电平,然后就进行列扫描。例如:假如按下3按钮,Y3 列扫描,把F4先拉低,然后读取F0-F3的状态,就会读出为1110,这就可 以知道是F3行拉低了,同时这时候是程序控制F4拉低的,这样就可以知道是F4列导致它转态变化了的,这样就可以定位出是F4列F3行的按键按下了;其他的列也是这样子扫描

lhh_qrsly的博客 7059

【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类

Python机器学习算法实现Author:louwillMachine Learning Lab 聚类分析(Cluster Analysis)是一类经典的无监督学习算法。在给定样...

fengdu78的博客 829

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

kmeans中的k的含义_实战 | KMeans 聚类算法

1. 写在前面如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,常见的机器学习算法:监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等无监督算法:聚类,降维,关联规则, PageRank等为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些机器学习的课程,但总感觉话语里比较深奥,读起...

weixin_34498545的博客 2248

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

k-means算法的matlab代码实现_【机器学习基础】数学推导+纯Python实现机器学习算法23:kmeans聚类...

Python机器学习算法实现Author:louwillMachine Learning Lab聚类分析(Cluster Analysis)是一类经典的无监督学习算法。在给定样本的情况下,聚类分析通过特征相似性或者距离的度量方法,将其自动划分到若干个类别中。常用的聚类分析方法包括层次聚类法(Hierarchical Clustering)、k均值聚类(K-means Clustering...

weixin_39664456的博客 529

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

手写KMeans聚类

手写KMeans聚类,纯python实现(使用了numpy 库),具体见代码,注释都在代码中。 # -*- coding: utf-8 -*- """ Created on Sun Jun 21 16:46:52 2020 @author: Lenovo """ import numpy as np #计算距离函数 def euclidean_distance(x1,x2): distance=0 for i in range(len(x1)): distance+=p

weixin_45690942的博客 631

Java递归中Scanner资源管理的优化实践

在Java编程中,递归算法通过自我调用来解决问题,而Scanner类则常用于处理输入流。当二者结合时,资源管理成为关键挑战。递归调用栈会创建多个栈帧,若每次递归都新建Scanner实例而未关闭,将导致文件描述符泄漏等系统资源问题。从工程实践角度看,采用RAII原则和try-with-resources机制能有效管理Scanner生命周期。典型解决方案包括将Scanner提升为方法参数或使用ThreadLocal实现线程安全。这些方法特别适用于在线评测系统、CLI工具等需要递归处理用户输入的开发场景,能显著提

weixin_34242331的博客 372

基于Python实现的机器学习算法(线性回归、逻辑回归、BP神经网络、SVM 支持向量机、K-Means 聚类算法、PCA 主成分分析、异常检测)

本文介绍了多种机器学习算法的Python实现,包括线性回归、逻辑回归、BP神经网络、SVM支持向量机、K-Means聚类和PCA主成分分析。详细讲解了线性回归的代价函数、梯度下降和归一化;逻辑回归的S型函数、正则化和多项式映射;BP神经网络的反向传播和权重初始化;SVM的核函数和大间隔分类;K-Means的聚类过程和目标函数;PCA的降维原理和数据恢复方法。各算法均配有实现代码和运行结果展示,并介绍了如何利用scikit-learn库进行简化实现。适用于机器学习初学者快速掌握核心算法的原理与实践。

毕业作品网站 1万+

聚类算法KMeans

这一节我们来讨论下聚类算法,聚类属于无监督问题,给出的数据没有标签值,需要机器学习算法自行去探索其中的规律,根据该规律将相近的数据划分为一类。 聚类算法理解起来非常容易,没有数学公式的推导。我们用下图来做个简单的说明,原始数据是没有颜色的,我们通过聚类算法将相近的数据分成了三类,并标记了三种颜色。 1.K-MEANS算法的基本概念 1.指定簇的个数,需要指定K值,k-means会根据指定的k值将数据分为k类。实际代码:km = KMeans(n_clusters = 3),代码中的3就是我们指定的k值。

taon1607的博客 1018
上一篇: Python内置OS模块用法详解
下一篇: 中国大学前10强!校友会2020世界一流大学排名发布
机器学习算法那些事
博客等级 码龄9年 1633粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值