Python实现means聚类

means聚类是一种基于距离的聚类算法,它通过反复计算每个样本与各个聚类中心的距离,并将样本分配到距离最近的聚类中心所属的类别中。本文将详细介绍如何使用Python实现means聚类算法。

一、数据预处理

在进行聚类之前,我们需要对数据进行预处理。首先,导入所需要的库:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets

接下来,我们可以使用sklearn库中的数据集来生成一些测试数据:

iris = datasets.load_iris()
X = iris.data

数据预处理的一项重要任务是对数据进行标准化,以确保所有特征具有相同的重要性。可以使用sklearn库的StandardScaler类来实现:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

二、计算距离

在means聚类算法中,需要用到距离的计算。常用的距离计算方法有欧式距离、曼哈顿距离等。这里我们以欧式距离为例:

def euclidean_distance(a, b):
    return np.sqrt(np.sum((a - b) ** 2))

# 示例
point1 = np.array([0, 0])
point2 = np.array([3, 4])
distance = euclidean_distance(point1, point2)
print(distance)

三、初始化聚类中心

在算法初始阶段,需要随机选择一些样本作为聚类中心。以下是一个简单的示例:

def init_centers(X, k):
    np.random.seed(42)
    indices = np.random.choice(range(len(X)), k, replace=False)
    centers = X[indices]
    return centers

# 示例
centers = init_centers(X_scaled, 3)
print(centers)

四、分配样本到最近的聚类中心

在means聚类算法的每一次迭代中,需要将每个样本分配到距离最近的聚类中心所属的类别中。以下是一个简单的实现:

def assign_samples(X, centers):
    n_samples = len(X)
    labels = np.zeros(n_samples)
    for i in range(n_samples):
        distances = [euclidean_distance(X[i], center) for center in centers]
        cluster_index = np.argmin(distances)
        labels[i] = cluster_index
    return labels

# 示例
labels = assign_samples(X_scaled, centers)
print(labels)

五、更新聚类中心

在means聚类算法的每一次迭代中,需要更新聚类中心。以下是一个简单的实现:

def update_centers(X, labels, k):
    centers = np.zeros((k, X.shape[1]))
    for i in range(k):
        cluster_samples = X[labels == i]
        centers[i] = np.mean(cluster_samples, axis=0)
    return centers

# 示例
centers = update_centers(X_scaled, labels, 3)
print(centers)

六、迭代直到收敛

最后,我们需要将上述的步骤迭代执行,直到聚类中心不再变化为止:

def kmeans(X, k, max_iters):
    centers = init_centers(X, k)
    for _ in range(max_iters):
        labels = assign_samples(X, centers)
        new_centers = update_centers(X, labels, k)
        if np.all(centers == new_centers):
            break
        centers = new_centers
    return labels, centers

# 示例
labels, centers = kmeans(X_scaled, 3, max_iters=100)
print(labels)

七、结果可视化

最后,我们可以使用matplotlib库将聚类结果可视化:

def plot_clusters(X, labels, centers):
    plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
    plt.scatter(centers[:, 0], centers[:, 1], marker='X', s=200, c='red')
    plt.show()

plot_clusters(X_scaled, labels, centers)

以上就是使用Python实现means聚类算法的完整代码示例。通过对数据预处理、距离计算、初始化聚类中心、分配样本到最近的聚类中心、更新聚类中心以及迭代直到收敛等步骤的实现,我们可以得到一组聚类结果,并通过结果可视化进行观察和分析。

原创文章,作者:ZYQT,如若转载,请注明出处:https://www.beidandianzhu.com/g/5746.html

(0)
ZYQT的头像ZYQT
上一篇 2025-01-04
下一篇 2025-01-04

相关推荐

  • Python如何去掉后缀名显示

    在Python中,我们可以使用字符串处理函数和正则表达式来去掉文件名的后缀名。 一、使用字符串处理函数 Python提供了丰富的字符串处理函数,其中就包含了去掉文件名后缀的函数。 …

    程序猿 2024-12-17
  • R语言和Python相似吗?

    在这篇文章中,我们将探讨R语言和Python两种编程语言之间的相似性。通过对比它们的语法、功能、应用领域等方面,我们可以看到它们之间的共同之处和差异,并帮助您做出选择。 一、语法相…

    程序猿 2024-12-29
  • 选择学Python的人的优势与魅力

    Python是一种简单易学、功能强大的编程语言,因此越来越多的人将Python作为第一门编程语言进行学习。那么,选择学习Python的人有哪些优势和魅力呢?接下来,我们将从多个方面…

    程序猿 2024-12-17
  • 计算机二级考试有Python吗

    计算机二级考试是国家统一举办的一项计算机应用基础考试,用于测试考生在计算机应用领域的基本知识和能力。Python作为一种简洁、易学、功能强大的编程语言,在计算机教育和实际应用中有着…

    程序猿 2025-01-08
  • (电脑配置)求组装一台静音的HDPC

    理念:cpu够用,强调性价, 楼主您好,很高兴为您解答! 静音是肯定的,因为现在的CPU风扇都带有防尘网,所以散热效果非常好。但是你如果想要静音的话就要看看机箱是不是够大了,要是不…

  • 使用Python画平面曲线

    Python是一门功能强大且易于学习的编程语言,它提供了各种绘图库和工具,使得我们可以轻松地在平面上画出各种曲线。本文将从不同的角度详细介绍Python画平面曲线的应用。 一、ma…

    程序猿 2024-12-22
  • Python多处理调度tas

    Python多处理调度tas是一个实现多任务调度的模块,它允许我们同时运行多个任务,提高程序的并发性和效率。本文将从多个方面对Python多处理调度tas进行详细阐述。 一、前言 …

    程序猿 2024-12-17
  • 点球大战Python

    点球大战是一种足球比赛中的形式,当比赛结束时,如果双方球队得分相同,则需要通过点球大战来决定胜负。在这个游戏中,选手需要一定的技巧和运气来射门得分。 一、点球大战规则 1、球员轮流…

    程序猿 2024-12-27
  • Python实现瑞利信道

    本文将详细介绍如何使用Python实现瑞利信道。 一、瑞利信道简介 瑞利信道是一种常见的无线信道模型,常用于模拟无线通信环境中的多径传播。在瑞利信道中,信号会经历多个不同路径的传播…

    程序猿 2024-12-17
  • Python中显示器隐藏代码

    显示器隐藏代码是指在程序运行过程中,将代码的执行过程隐藏起来,只显示结果而不显示具体的代码。这在一些敏感信息处理、保护知识产权等场景中非常有用。本文将从多个方面介绍在Python中…

    程序猿 2024-12-17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

分享本页
返回顶部