利用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 dict乱码如何解决

    当在Python中处理字典时,如果出现了乱码,一般是由于编码问题引起的。在处理字典时,推荐将字符串转成Unicode格式,这样就不会出现编码问题。 下面是解决Python dict乱码的两种示例: 示例一:使用json模块解析乱码 有时候,我们可能需要将Python dict转换成json格式进行传输,而json格式不支持某些字符集,因此,在转换时可能会出现…

    python 2023年5月20日
    00
  • Python中使用第三方库xlrd来读取Excel示例

    下面我为您讲解“Python中使用第三方库xlrd来读取Excel示例”的完整实例教程。 一、xlrd库简介 xlrd是一个Python模块,用于从Excel文件读取数据。它可以读取Excel文件,其中可能包含多个工作表。使用xlrd可以读取单元格数据、格式、公式和一些其他属性。 二、xlrd库的安装 在使用xlrd库之前,需要先安装它。可以使用pip命令进…

    python 2023年5月13日
    00
  • python监控键盘输入实例代码

    下面我将为您详细讲解监控键盘输入的Python实例代码: 实现Python监控键盘输入的模块有很多,本攻略会介绍两种常用的方法: 1. 使用pynput库进行键盘输入监听 首先,在命令行中使用pip命令安装pynput库: pip install pynput 在Python代码中引入pynput库 from pynput import keyboard 可…

    python 2023年6月3日
    00
  • python中多层嵌套列表的拆分方法

    Python中多层嵌套列表的拆分方法 在Python中,我们可以使用循环和递归的方法来拆分多层嵌套列表。本攻略将详细介绍如何拆分多层嵌套列表。 使用循环拆分多层嵌套列表 以下是一个示例代码,演示如何使用循环拆分多层嵌套列表: # 使用循环拆分多层嵌套列表 nested_list = [1, [2, [3, 4], 5], 6, [7, 8]] flat_li…

    python 2023年5月13日
    00
  • python中datetime模块中strftime/strptime函数的使用

    Python中datetime模块中strftime/strptime函数的使用 介绍 datetime模块是Python标准库中用于处理日期和时间的模块。该模块中包含了许多函数可以方便地进行时间戳和时间之间的互相转换,其中就包括strftime()和strptime()函数。 strftime()函数用于将日期时间类型的数据格式化为字符串。 strptim…

    python 2023年6月2日
    00
  • Python列表删除重复元素与图像相似度判断及删除实例代码

    下面是针对“Python列表删除重复元素与图像相似度判断及删除实例代码”的完整攻略: Part 1:Python列表删除重复元素 首先,需要知道Python中的一种数据结构——set(集合),它是一个无序且不重复的元素序列,可以用于关键字查找和去重等。 要删除列表中的重复元素,最简单的方法就是将列表转换成集合,再将集合转回列表即可。代码如下: a = [1,…

    python 2023年6月3日
    00
  • Pycharm安装第三方库时Non-zero exit code错误解决办法

    以下是关于“Pycharm安装第三方库时Non-zero exit code错误解决办法”的完整攻略: 问题描述 在使用 Pycharm 安装第三方库时,有时会出现 Non-zero exit code 错误,这个错误通是由于安装过程中出现了错误导致的。下面是一个例: pip install numpy 在上述代码中,尝试使用 pip 安装 numpy 库,…

    python 2023年5月13日
    00
  • 如何处理Python3.4 使用pymssql 乱码问题

    接下来我会详细讲解如何处理Python3.4使用pymssql乱码问题的完整攻略。 问题描述 在Python3.4中使用pymssql连接Microsoft SQL Server数据库时,可能会出现中文乱码的问题。 解决方法 1. 设置字符集 通过设置连接字符集来解决中文乱码的问题。默认情况下,pymssql使用的是iso-8859-1字符集,而我们通常使用…

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