机器学习——聚类算法-KMeans聚类

news/2024/5/20 10:15:53 标签: 机器学习, 算法, 聚类

机器学习——聚类算法-KMeans聚类

机器学习中,聚类是一种无监督学习方法,用于将数据集中的样本划分为若干个簇,使得同一簇内的样本相似度高,不同簇之间的样本相似度低。KMeans聚类是一种常用的聚类算法之一,本文将介绍KMeans算法的原理、流程、聚类质量评价方法、优缺点以及KMeans++算法,并通过Python实现一个简单的KMeans聚类算法示例。

KMeans算法流程

KMeans算法的流程如下:

  1. 初始化质心: 从数据集中随机选择K个样本作为初始质心。

  2. 样本分配: 将每个样本分配到距离最近的质心所属的簇中。

  3. 更新质心: 计算每个簇的新质心,即该簇中所有样本的平均值。

  4. 重复步骤2和步骤3,直到满足停止条件为止: 常见的停止条件包括质心不再改变、达到最大迭代次数等。

聚类质量评价方法

常用的聚类质量评价方法包括簇内离差平方和(WCSS)、轮廓系数等。其中,簇内离差平方和(WCSS)用于评估簇内样本的紧密程度,其定义如下:

W C S S = ∑ i = 1 K ∑ x ∈ C i ∥ x − μ i ∥ 2 WCSS = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2 WCSS=i=1KxCixμi2

其中, K K K是簇的个数, C i C_i Ci 是第 i i i个簇, μ i \mu_i μi是第 i i i个簇的质心, ∥ x − μ i ∥ \|x - \mu_i\| xμi是样本 x x x到质心 μ i \mu_i μi的欧氏距离。

KMeans聚类的优缺点

优点:
  • 简单易实现,计算复杂度低。
  • 对大数据集有较好的伸缩性。
缺点:
  • 需要事先指定簇的个数K。
  • 对初始质心的选择敏感,可能会陷入局部最优解。
  • 对噪声和异常值敏感。

KMeans++算法

KMeans++算法是KMeans算法的改进版,通过改进初始质心的选择,提高了算法的效率和稳定性。KMeans++算法的初始质心选择步骤如下:

  1. 随机选择一个样本作为第一个质心。
  2. 对于每个样本,计算其与已选择质心的最小距离(即最近质心)。
  3. 根据每个样本与最近质心的距离的平方,按照概率分布选择下一个质心。
  4. 重复步骤2和步骤3,直到选择足够数量的质心。

Python实现算法

以下是使用Python实现的简单KMeans聚类算法示例:

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

# 生成样本数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=42)

# 定义KMeans聚类算法
class KMeans:
    def __init__(self, n_clusters, max_iters=300):
        self.n_clusters = n_clusters
        self.max_iters = max_iters

    def fit(self, X):
        n_samples, n_features = X.shape
        centroids_indices = np.random.choice(n_samples, self.n_clusters, replace=False)
        centroids = X[centroids_indices]

        for _ in range(self.max_iters):
            distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
            labels = np.argmin(distances, axis=0)

            new_centroids = np.array([X[labels == k].mean(axis=0) for k in range(self.n_clusters)])

            if np.all(centroids == new_centroids):
                break

            centroids = new_centroids

        self.labels_ = labels
        self.cluster_centers_ = centroids

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

# 可视化聚类结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_, cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red', s=200, label='Centroids')
plt.title('KMeans Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.show()

在这里插入图片描述

以上代码使用make_blobs函数生成了一个样本数据集,并使用自定义的KMeans类实现了KMeans聚类算法。最后,通过可视化展示了聚类的结果。

总结

KMeans聚类是一种常用的无监督学习算法,通过迭代计算样本的簇心和样本的簇分配,将样本划分为不同的簇。本文介绍了KMeans算法的原理、流程、聚类质量评价方法、优缺点以及KMeans++算法,并通过Python实现了一个简单的KMeans聚类算法示例。KMeans聚类算法可以应用于许多领域,如数据分析、模式识别和图像分割等。


http://www.niftyadmin.cn/n/5455195.html

相关文章

提升JavaScript代码质量的最佳实践

在JavaScript编程中,代码质量优化是一项重要的技能。它可以帮助我们提高代码的可读性、可维护性和性能。本文将通过一些实际优化过程中的案例,展示如何通过一些技巧和最佳实践,使我们的代码更加优雅。 1. 避免嵌套循环 嵌套循环会增加代码的…

Android ViewBinding 使用

Android ViewBinding 使用 一、引言 随着 Android 开发的不断发展,对于视图绑定的需求也日益增长。ViewBinding 是 Android Jetpack 中的一个功能,它可以帮助开发者以更安全、更简洁的方式引用视图。本教程将详细介绍如何在 Android 项目中使用 ViewBi…

抖音短视频矩阵系统源代码开发部署/SaaS贴牌/源码开源

抖音短视频矩阵系统的源代码开发部署可以分为以下几个步骤: 确定需求:首先,你需要确定你想要开发的具体功能和特性,比如用户注册、上传短视频、评论等。 开发源代码:根据需求,你可以选择使用合适的编程语言…

【SAP2000】在框架结构中应用分布式面板荷载Applying Distributed Panel Loads to Frame Structures

在框架结构中应用分布式面板荷载 Applying Distributed Panel Loads to Frame Structures 使用"Uniform to Frame"选项,可以简单地将荷载用于更多样化的情况。 With the “Uniform to Frame” option, loads can be easily used for a greater diversity of situat…

FizzBuzzWhizz用C++

本文是根据大佬张晓龙的那篇FizzBuzzWhizz in C而来。用他的方法做了实现。见附件~

速盾:多节点cdn加速防御什么意思

多节点CDN加速防御是一种常见的网络加速和安全防御技术,它结合了多个节点的内容分发网络(CDN)和安全防御机制,旨在优化网站服务的性能和保障网站的安全。 CDN技术是一种分布式架构,通过将网站的内容缓存在多个节点上&…

Selenium 学习(0.22)——软件测试之小结

Junit 等一系列自动化工具不用啰嗦了,自己就是小白再搞科普就装了。 把后面相关内容看了一下,使用这些测试工具一样编写代码(驱动模块【调用接口的代码片段】,桩模块【响应输出结果的代码片段,也就是被测模块调用的模块…

SpringBoot 优雅的发送邮件(附源码)

文章目录 前言一、简介1. 什么是 SMTP?2. 什么是 IMAP?3. 什么是 POP3?4. IMAP 和 POP3 协议有什么不同呢?5. 什么是 JavaMailSender 和 JavaMailSenderImpl?6. 如何通过 JavaMailSenderImpl 发送邮件?二、获取邮箱配置三、简单实例1. 引入依赖2. 配置邮箱信息3. 功能实现…