利用python实现聚类分析K-means算法的详细过程

Python实现K-means聚类算法

K-means聚类算法是一种常用的无监督学习算法,它的主要思想是将数据集划分为K个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。本文将详细讲解如何使用Python实现K-means聚类算法,并提供两个示例说明。

K-means聚类算法原理

K-means聚类算法的基本思想是从数据集中随机选择K个点作为初始的聚类中心,然后将每个数据点分配到距离最近的聚类中心所在的簇中,再重新计算每个簇的聚类中心,直到聚类中心不再发生变化或达到最大迭代次数为止。具体来说,算法的步骤如下:

  1. 随机选择K个点作为初始的聚类中心;
  2. 将每个数据点分配到距离最近的聚类中心所在的簇中;
  3. 重新计算每个簇的聚类中心;
  4. 如果聚类中心不再发生变化或达到最大迭代次数,则停止迭代,否则返回步骤2。

其中,距离通常采用欧氏距离或曼哈顿距离来计算。

Python实现K-means聚类算法

在Python中,我们可以使用NumPy库和Matplotlib库来实现K-means聚类算法。下面是一个简单的示例代码,用于对二维数据进行聚类。

import numpy as np
import matplotlib.pyplot as plt

# 定义K-means聚类算法
def kmeans(X, K, max_iters=100):
    # 随机选择K个点作为初始的聚类中心
    centers = X[np.random.choice(len(X), K, replace=False)]

    for i in range(max_iters):
        # 将每个数据点分配到距离最近的聚类中心所在的簇中
        labels = np.argmin(((X[:, np.newaxis, :] - centers)**2).sum(axis=2), axis=1)

        # 重新计算每个簇的聚类中心
        new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])

        # 如果聚类中心不再发生变化,则停止迭代
        if np.allclose(centers, new_centers):
            break

        centers = new_centers

    return labels, centers

# 生成随机的二维数据
np.random.seed(0)
X = np.random.randn(100, 2)

# 运行K-means聚类算法
K = 3
labels, centers = kmeans(X, K)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(centers[:, 0], centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

在这个示例中,我们首先生成了随机的二维数据X。然后,我们定义了K-means聚类算法kmeans,其中X是数据集,K是簇的个数,max_iters是最大迭代次数。接下来,我们运行K-means聚类算法,对二维数据进行聚类,并返回每个数据点所属的簇和每个簇的聚类中心。最后,我们使用Matplotlib库可视化结果,将数据点和聚类中心绘制在同一张图上。

示例1:使用K-means聚类算法对图像进行分割

在这个示例中,我们将使用K-means聚类算法对图像进行分割。图像分割是一种常用的图像处理技术,其目标是将图像分成若干个区域,使得同一区域内的像素具有相似的特征,不同区域之间的像素具有明显的差异。

import numpy as np
import matplotlib.pyplot as plt
from skimage import io

# 定义K-means聚类算法
def kmeans(X, K, max_iters=100):
    # 随机选择K个点作为初始的聚类中心
    centers = X[np.random.choice(len(X), K, replace=False)]

    for i in range(max_iters):
        # 将每个数据点分配到距离最近的聚类中心所在的簇中
        labels = np.argmin(((X[:, np.newaxis, :] - centers)**2).sum(axis=2), axis=1)

        # 重新计算每个簇的聚类中心
        new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])

        # 如果聚类中心不再发生变化,则停止迭代
        if np.allclose(centers, new_centers):
            break

        centers = new_centers

    return labels, centers

# 读取图像数据
image = io.imread('lena.png')

# 将图像数据转换为二维数组
X = image.reshape(-1, 3)

# 运行K-means聚类算法
K = 16
labels, centers = kmeans(X, K)

# 将每个像素点的颜色替换为所属簇的聚类中心的颜色
X_new = centers[labels].astype(np.uint8)

# 将二维数组转换为图像数据
image_new = X_new.reshape(image.shape)

# 可视化结果
fig, ax = plt.subplots(1, 2, figsize=(8, 4))
ax[0].imshow(image)
ax[0].set(title='Original image')
ax[1].imshow(image_new)
ax[1].set(title='Segmented image')
plt.show()

在这个示例中,我们首先读取了一张图像数据,并将其转换为二维数组X。然后,我们运行K-means聚类算法,对图像数据进行分割,并将每个像素点的颜色替换为所属簇的聚类中心的颜色。最后,我们将二维数组转换为图像数据,并使用Matplotlib库可视化结果,将原始图像和分割后的图像绘制在同一张图上。

示例2:使用K-means聚类算法对手写数字进行分类

在这个示例中,我们将使用K-means聚类算法对手写数字进行分类。手写数字分类是一个经典的机器学习问题,其目标是将手写数字图像分成10个类别,分别对应数字0到9。

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

# 定义K-means聚类算法
def kmeans(X, K, max_iters=100):
    # 随机选择K个点作为初始的聚类中心
    centers = X[np.random.choice(len(X), K, replace=False)]

    for i in range(max_iters):
        # 将每个数据点分配到距离最近的聚类中心所在的簇中
        labels = np.argmin(((X[:, np.newaxis, :] - centers)**2).sum(axis=2), axis=1)

        # 重新计算每个簇的聚类中心
        new_centers = np.array([X[labels == k].mean(axis=0) for k in range(K)])

        # 如果聚类中心不再发生变化,则停止迭代
        if np.allclose(centers, new_centers):
            break

        centers = new_centers

    return labels, centers

# 加载手写数字数据集
digits = load_digits()

# 运行K-means聚类算法
K = 10
labels, centers = kmeans(digits.data, K)

# 可视化结果
fig, ax = plt.subplots(2, 5, figsize=(8, 4))
for i in range(10):
    ax[i//5, i%5].imshow(centers[i].reshape(8, 8), cmap='gray')
    ax[i//5, i%5].set(title=str(i))
plt.show()

在这个示例中,我们首先加载了手写数字数据集digits。然后,我们运行K-means聚类算法,对手写数字进行分类,并返回每个手写数字所属的类别和每个类别的聚类中心。最后,我们使用Matplotlib库可视化结果,将每个类别的聚类中心绘制在不同的子图上。

总结

本文详细讲解了如何使用Python实现K-means聚类算法,并提供了两个示例说明。K-means聚类算法是一种常用的无监督学习算法,它的主要思想是将数据集划分为K个簇,使得同一簇内的数据点相似度较高,不同簇之间的数据点相似度较低。在实际应用中,我们可以根据具体的需求选择不同的距离度量和聚类中心初始化方法,并结合其他无监督学习算法进行综合处理。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用python实现聚类分析K-means算法的详细过程 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • Python自动爬取图片并保存实例代码

    Python自动爬取图片并保存实例代码 本攻略将介绍如何使用Python自动爬取图片并保存到本地。我们将使用Python的requests库和BeautifulSoup库来获取和解析网页内容,使用os库和urllib库来创建和保存图片文件。 获取图片链接 我们可以使用Python的requests库和BeautifulSoup库来获取图片链接。以下是一个示例…

    python 2023年5月15日
    00
  • 如何在Python中做指数和对数的曲线拟合

    下面是如何在Python中做指数和对数的曲线拟合的完整攻略。 1. 准备数据 首先,我们需要准备需要拟合的数据,例如指数和对数函数示例代码: import numpy as np x = np.array([0, 1, 2, 3, 4, 5]) y1 = np.exp(x) y2 = np.log(x + 1) 2. 导入库 其次,我们需要导入所需的库,例如…

    python-answer 2023年3月25日
    00
  • python sys.argv[]用法实例详解

    当我们在终端运行Python程序时,可以给程序传递一些参数,这些参数可以在程序中被获取和使用。Python提供了sys模块来获取命令行参数,其中sys.argv就是其中比较重要的一个属性。 sys.argv是一个列表,列表里的元素是命令行参数,其中第一个元素是该程序的文件名。在Python程序中,可以通过数组下标来获取对应的命令行参数。当然在实际使用时,我们…

    python 2023年6月2日
    00
  • Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件

    Python网络编程之使用email、smtplib、poplib、imaplib模块收发邮件 Python提供了多个模块来进行邮件的收发操作,其中包括email、smtplib、poplib和imaplib模块。本文将详细介绍这些模块的用法,并提供两个示例。 email模块 email模块提供了创建和解析邮件的功能。我们可以使用email模块来创建邮件对象…

    python 2023年5月15日
    00
  • 浅谈python中字典append 到list 后值的改变问题

    以下是“浅谈Python中字典append到List后值的改变问题”的完整攻略。 1. 问题描述 在Python中,将字典添加到List中后如果修改字典的,List中的值也会随之改变。这是因为List中存储的是字典的引用,而不是典的副本。因此,如果修改字典的值,List中存储的引用指向的字典会随之改变。 2.说明 示例1:List中存储字典引用 my_dic…

    python 2023年5月13日
    00
  • Python区块链客户端类开发教程

    Python区块链客户端类开发教程 前言 区块链是近年来非常热门的技术领域,而Python作为一门流行的编程语言,也在该领域中占有重要地位。本教程将介绍如何使用Python开发基于区块链的客户端类。 准备工作 在开始开发之前,需要先安装以下几个Python库: requests, 用于发送HTTP请求 hashlib, 用于计算哈希值 json, 用于解析J…

    python 2023年6月3日
    00
  • python 实用工具状态机transitions

    下面我来详细讲解一下“Python 实用工具状态机 transitions”的使用攻略。 什么是 transitions? transitions 是一个轻量级 Python 状态机库,它允许您定义状态和状态之间的转换,以及在转换时需要执行的操作和条件。状态机特别适用于控制复杂的代码流程。 安装 transitions transitions 可以通过 pi…

    python 2023年5月23日
    00
  • Python中三个不可思议的返回功能分享

    Python中三个不可思议的返回功能分享 在Python中,有三个不可思议的返回功能,分别是return、yield和raise。本文将详细讲解这三个返回功能的使用方法和注意事项,并提供两个示例说明。 return return是Python中最常用的返回功能,用于从函数中返回一个值。当函数执行到return语句时,函数将会立即停止执行将return后面的值…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部