首页 > 编程语言 >第九天:K-Means算法

第九天:K-Means算法

时间:2024-08-11 19:25:57浏览次数:13  
标签:xj 第九天 plt Means kmeans 算法 质心

K-Means算法简介

K-Means算法是一种广泛使用的聚类算法,旨在将数据集分成K个预定义的簇。每个簇的中心是簇中所有点的均值,称为质心。K-Means算法的目标是最小化每个数据点到其所属簇的质心的距离的平方和。

算法原理

K-Means算法的工作原理可以分为以下几个步骤:

  1. 初始化: 随机选择K个数据点作为初始质心。
  2. 分配簇: 将每个数据点分配到距离最近的质心所属的簇。
  3. 更新质心: 计算每个簇的新质心,质心是簇中所有点的均值。
  4. 重复: 重复步骤2和3,直到质心不再改变或达到最大迭代次数。

数学公式

假设有 n n n 个数据点 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1​,x2​,…,xn​,每个数据点有 d d d个特征。我们需要将这些数据点划分为 K K K个簇。

  1. 目标函数: K-Means算法的目标是最小化每个数据点到其所属簇质心的距离的平方和,即目标函数 J J J 为:

J = ∑ i = 1 K ∑ x j ∈ S i ∥ x j − μ i ∥ 2 J = \sum_{i=1}^{K} \sum_{x_j \in S_i} \|x_j - \mu_i\|^2 J=i=1∑K​xj​∈Si​∑​∥xj​−μi​∥2

其中, S i S_i Si​是簇 i i i 中的数据点集合, μ i \mu_i μi​是簇 i i i 的质心。

  1. 质心计算: 簇 i i i的质心 μ i \mu_i μi​ 为簇中所有点的均值:

μ i = 1 ∣ S i ∣ ∑ x j ∈ S i x j \mu_i = \frac{1}{|S_i|} \sum_{x_j \in S_i} x_j μi​=∣Si​∣1​xj​∈Si​∑​xj​

算法步骤

  1. 初始化: 随机选择 K K K 个初始质心。
  2. 分配: 对于每个数据点,计算其到每个质心的距离,并将其分配给最近的质心。

Cluster ( x j ) = arg ⁡ min ⁡ i ∥ x j − μ i ∥ 2 \text{Cluster}(x_j) = \arg\min_{i} \|x_j - \mu_i\|^2 Cluster(xj​)=argimin​∥xj​−μi​∥2

  1. 更新: 计算新的质心位置。

μ i = 1 ∣ S i ∣ ∑ x j ∈ S i x j \mu_i = \frac{1}{|S_i|} \sum_{x_j \in S_i} x_j μi​=∣Si​∣1​xj​∈Si​∑​xj​

  1. 重复: 重复步骤2和3直到质心不再变化或达到最大迭代次数。

代码实现

以下是Python中的K-Means算法实现,使用scikit-learn库:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans

# 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 使用KMeans算法进行聚类
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# 绘制结果
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')

centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='red', s=200, alpha=0.75, marker='X')
plt.title('K-Means Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

代码解释

  1. 生成数据: 使用make_blobs生成模拟数据。
  2. 训练模型: 使用KMeans类进行聚类。
  3. 预测与绘图: 使用matplotlib绘制聚类结果及质心。

我们使用make_blobs数据集来绘制效果图

在这里插入图片描述

总结

K-Means算法是一种简单而有效的聚类方法,但它也有一些缺点,如对初始质心的选择敏感,可能会陷入局部最优解。为了解决这些问题,可以使用多次初始化(K-Means++)等改进方法。通过合理选择K的值和适当的初始质心,K-Means算法可以为数据分析和模式识别提供有效的支持。

希望这篇博客能帮助你更好地理解K-Means算法及其应用。如果你有任何问题或建议,请随时联系我!

标签:xj,第九天,plt,Means,kmeans,算法,质心
From: https://blog.csdn.net/weixin_54856108/article/details/141017524

相关文章

  • 算法题系列5
    题目描述模拟一套简化的序列化传输方式,请实现下面的数据编码与解码过程1.编码前数据格式为[位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer/String/Compose(Compose的数据类型表示该存储的数据也需要编码)2.编码后数据参考图示,数据......
  • 用电量预测 | 基于BiLSTM双向长短期记忆神经网络算法的用电量预测附matlab完整代码
    用电量预测|基于BiLSTM双向长短期记忆神经网络算法的用电量预测附matlab完整代码数据收集:收集历史用电量数据,包括时间戳和相应的用电量值。选择模型:选择合适的模型进行预测,可以根据数据特点和需求选择合适的模型。训练模型:使用历史数据训练模型,并根据评估指标来调整......
  • 【WSN覆盖优化】基于鱼鹰优化算法OOA求解无线传感器节点2D覆盖优化问题附Matlab代码
    鱼鹰优化算法(OspreyOptimizationAlgorithm,OOA)是一种基于鱼鹰捕鱼行为的启发式优化算法,可用于解决优化问题。在无线传感器网络(WSN)中,覆盖优化是一个关键问题,涉及到最大化网络覆盖范围并减少节点数量。以下是一个简单的示例框架,展示如何基于OOA算法求解无线传感器节点的二......
  • 什么是算法
    1.概述算法指的是为了完成某一事情(或者解决某一问题),而经过特定步骤的处理之后得到结果的一种手段具有明确的步骤/顺序/可行性计算机擅长做固定的运算,例如求和等计算型的处理,通过合适的算法(合适的处理策略),可以大大降低运算所需要的时间2.举例为了对数字进行排序......
  • 算法笔记|Day22回溯算法IV
    算法笔记|Day22回溯算法IV☆☆☆☆☆leetcode491.递增子序列题目分析代码☆☆☆☆☆leetcode46.全排列题目分析代码☆☆☆☆☆leetcode47.全排列II题目分析代码☆☆☆☆☆leetcode332.重新安排行程(待补充)题目分析代码☆☆☆☆☆leetcode51.N皇后(待补充)题目分析......
  • 【WSN覆盖优化】基于斑马优化算法ZOA求解无线传感器节点2D覆盖优化问题附Matlab代码
    以下是一个简单的示例Matlab代码,演示如何使用斑马优化算法(ZebraOptimizationAlgorithm,ZOA)来解决无线传感器节点(WSN)的2D覆盖优化问题:ini复制%ZebraOptimizationAlgorithm(ZOA)forWirelessSensorNetwork(WSN)CoverageOptimization%设置参数num_nodes=50;......
  • 探索Python中的插入排序算法
    探索Python中的插入排序算法插入排序(InsertionSort)是一种简单直观的排序算法。虽然在大规模数据集上效率不如一些高级排序算法,但插入排序在处理小规模数据集或部分有序的数据时表现非常优秀。本文将介绍插入排序的工作原理、实现方法以及它的时间复杂度。插入排序的工作......
  • Dijkstra算法
    Dijkstra算法是一种用于在加权图中寻找单源最短路径的算法。它由荷兰计算机科学家EdsgerDijkstra在1956年提出。该算法基于贪心策略,通过不断选择当前最短路径上的顶点来逐步确定最短路径。它使用一个距离数组来记录起始点到每个顶点的距离,并使用一个集合来存储已经求得最短路......
  • 图像分割算法
    5.1阈值分割(Thresholding)介绍阈值分割是一种简单而有效的图像分割方法,通过设置一个或多个阈值,将图像分割为前景和背景区域。常见的阈值分割方法包括全局阈值、自适应阈值和Otsu阈值。原理阈值分割通过比较像素值与设定的阈值,将像素分类为前景或背景。公式在阈值分割......
  • 499 道 Java 面试题 (附答案):JVM+ 分布式 + 算法 + 锁 +MQ
    Spring如何管理事务的。Spring怎么配置事务(具体说出一些关键的xml元素)。说说你对Spring的理解,非单例注入的原理?它的生命周期?循环注入的原理,aop的实现原理,说说aop中的几个术语,它们是怎么相互工作的。Springmvc中DispatcherServlet初始化过程。netty......