python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)

Python实现鸢尾花三种聚类算法(K-means, AGNES, DBScan)

1. 简介

聚类是一种无监督学习算法,它将相似的数据点分组到同一个簇中。本文将介绍如何使用Python实现三种聚类算法:K-means、AGNES和DBScan,并使用鸢尾花数据集进行演示。

2. 数据集

我们将使用鸢尾花数据集来演示如何使用聚类算法。该数据集包含150个样本,每个样本有四个特征:花萼长度、花萼宽度、花瓣长度和花瓣宽度。以下是数据集的示例:

花萼长度 花萼宽度 花瓣长度 花瓣宽度 类别
5.1 3.5 1.4 0.2 0
4.9 3.0 1.4 0.2 0
7.0 3.2 4.7 1.4 1
6.4 3.2 4.5 1.5 1
6.3 3.3 6.0 2.5 2
5.8 2.7 5.1 1.9 2

3. K-means算法

K-means算法是一种基于距离的聚类算法,它将数据点分为K个簇,使得每个簇内的数据点相似度较高,而不同簇之间的相似度较低。具体实现步骤如下:

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

以下是K-means算法的Python实现:

import numpy as np

class KMeans:
    def __init__(self, k=3, max_iter=100):
        self.k = k
        self.max_iter = max_iter

    def fit(self, X):
        self.centroids = X[np.random.choice(len(X), self.k, replace=False)]
        for i in range(self.max_iter):
            clusters = [[] for _ in range(self.k)]
            for x in X:
                distances = [np.linalg.norm(x - c) for c in self.centroids]
                cluster_idx = np.argmin(distances)
                clusters[cluster_idx].append(x)
            prev_centroids = self.centroids.copy()
            for i, cluster in enumerate(clusters):
                if len(cluster) > 0:
                    self.centroids[i] = np.mean(cluster, axis=0)
            if np.allclose(prev_centroids, self.centroids):
                break

    def predict(self, X):
        distances = np.array([np.linalg.norm(X - c, axis=1) for c in self.centroids])
        return np.argmin(distances, axis=0)

这个代码实现了一个名为KMeans的类,它包含两个方法:

  • fit(X):用于训练K-means聚类器,其中X是一个二维数组,表示每个样本的特征。
  • predict(X):用于对新样本进行聚类,其中X是一个二维数组,表示每个样本的特征;一个一维数组,表示每个样本所属的簇。

4. AGNES算法

AGNES算法是一种基于层次的聚类算法,它将数据点逐步合并成越来越大的簇,直到所有数据点都在同一个簇中。具体实现步骤如下:

  1. 将每个数据点视为一个簇。
  2. 计算每对簇之间的距离,并将距离最近的两个簇合并成一个新簇。
  3. 重复步骤2,直到所有数据点都在同一个簇中。

以下是AGNES算法的Python实现:

import numpy as np

class AGNES:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X):
        self.clusters = [[x] for x in X]
        while len(self.clusters) > self.k:
            distances = np.zeros((len(self.clusters), len(self.clusters)))
            for i in range(len(self.clusters)):
                for j in range(i+1, len(self.clusters)):
                    distances[i, j] = np.min([np.linalg.norm(x - y) for x in self.clusters[i] for y in self.clusters[j]])
            i, j = np.unravel_index(np.argmin(distances), distances.shape)
            self.clusters[i] += self.clusters[j]
            self.clusters.pop(j)

    def predict(self, X):
        return [np.argmin([np.linalg.norm(x - c) for c in cluster]) for x in X for cluster in self.clusters]

这个代码实现了一个名为AGNES的类,它包含两个方法:

  • fit(X):用于训练AGNES聚类器,其中X是一个二维数组,表示每个样本的特征。
  • predict(X):用于对新样本进行聚类,其中X是一个二维数组,表示每个样本的特征;一个一维数组,表示每个样本所属的簇。

5. DBScan算法

DBScan算法是一种基于密度的聚类算法,它将数据点分为核心点、边界点和噪声点三类。具体实现步骤如下:

  1. 对于每个数据点,计算它的邻域内的数据点数目。
  2. 如果一个数据点的邻域内的数据点数目大于等于指定阈值,则将其标记为核心点。
  3. 将所有核心点连接成簇,如果两个核心点的邻域有重叠,则将它们合并成一个簇。
  4. 将所有未被分配到簇中的数据点标记为噪声点。

以下是DBScan算法的Python实现:

import numpy as np

class DBScan:
    def __init__(self, eps=0.5, min_samples=5):
        self.eps = eps
        self.min_samples = min_samples

    def fit(self, X):
        self.labels_ = np.zeros(len(X), dtype=int)
        cluster_idx = 0
        for i, x in enumerate(X):
            if self.labels_[i] != 0:
                continue
            neighbors = self.region_query(X, i)
            if len(neighbors) < self.min_samples:
                self.labels_[i] = -1
                continue
            cluster_idx += 1
            self.labels_[i] = cluster_idx
            for j in neighbors:
                if self.labels_[j] == -1:
                    self.labels_[j] = cluster_idx
                if self.labels_[j] != 0:
                    continue
                self.labels_[j] = cluster_idx
                new_neighbors = self.region_query(X, j)
                if len(new_neighbors) >= self.min_samples:
                    neighbors += new_neighbors

    def predict(self, X):
        return self.labels_

    def region_query(self, X, i):
        return [j for j, x in enumerate(X) if np.linalg.norm(x - X[i]) <= self.eps]

这个代码实现了一个名为DBScan的类,它包含两个方法:

  • fit(X):用于训练DBScan聚类器,其中X是一个二维数组,表示每个样本的特征。
  • predict(X):用于对新样本进行聚类,其中X是一个二维数组,表示每个样本的特征;一个一维数组,表示每个样本所属的簇。

6. 示例

示例1

在示例1中,我们使用了鸢尾花数据集,使用KMeans类、AGNES类和DBScan类分别对数据集进行聚类,并输出聚类结果。

from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score

iris = load_iris()
X = iris.data
y = iris.target

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

kmeans = KMeans(k=3)
kmeans.fit(X)
kmeans_labels = kmeans.predict(X)
print('K-means Silhouette Score:', silhouette_score(X, kmeans_labels))

agnes = AGNES(k=3)
agnes.fit(X)
agnes_labels = agnes.predict(X)
print('AGNES Silhouette Score:', silhouette_score(X, agnes_labels))

dbscan = DBScan(eps=0.5, min_samples=5)
dbscan.fit(X)
dbscan_labels = dbscan.predict(X)
print('DBScan Silhouette Score:', silhouette_score(X, dbscan_labels))

这个示例将使用上述代码对鸢尾花数据集进行聚类,并输出聚类结果和轮廓系数。

示例2

在示例2中,我们使用了一个包含6个样本的数据集,每个样本有两个征:长度和宽度。我们使用KMeans类、AGNES类和DBScan类分别对数据集进行聚类,并输出聚类结果。

X = np.array([
    [1, 2],
    [2, 3],
    [3, 3],
    [3, 4],
    [4, 4],
    [5, 5],
])

kmeans = KMeans(k=2)
kmeans.fit(X)
kmeans_labels = kmeans.predict(X)
print('K-means Labels:', kmeans_labels)

agnes = AGNES(k=2)
agnes.fit(X)
agnes_labels = agnes.predict(X)
print('AGNES Labels:', agnes_labels)

dbscan = DBScan(eps=1, min_samples=2)
dbscan.fit(X)
dbscan_labels = dbscan.predict(X)
print('DBScan Labels:', dbscan_labels)

这个示例将使用上述代码对数据集进行聚类,并输出聚类结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan) - Python技术站

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

相关文章

  • Python使用ffmpeg合成视频、音频的实现方法

    课程基本介绍: 在Python语言中使用ffmpeg库来合成视频和音频是一种非常方便的方法。本课程将会提供完整的Python代码示例来实现这一过程。在本课程中,你将学习如何使用ffmpeg库编写代码,合成音频和视频文件。 第一步:安装FFmpeg和pydub库 在开始之前,我们需要安装ffmpeg和pydub库。 首先下载ffmpeg可以从官网下载(http…

    python 2023年5月19日
    00
  • python实现模拟器爬取抖音评论数据的示例代码

    下面是Python实现模拟器爬取抖音评论数据的完整攻略。 1. 环境准备 1.1 安装Python 首先需要在本地电脑上安装Python,并配置好环境变量。可以到Python 官网下载最新的稳定版本,并按照向导进行安装。 1.2 安装浏览器驱动 抓取抖音评论数据需要用到浏览器模拟器,所以还需要安装对应的浏览器驱动。这里以Chrome为例,大家可以到Chrom…

    python 2023年6月3日
    00
  • 简单谈谈python中的Queue与多进程

    Python中的Queue模块是实现多线程编程中重要的一个模块,它可以用来实现多线程之间的通信和数据传递。同时,Python中也提供了多进程的支持,与多线程一样,多进程编程中也需要用到队列。 Queue模块 Queue是Python中提供的一个标准库,可以用于实现多线程之间的通信。Queue模块提供的队列分为三种,分别是FIFO队列、LIFO队列和优先级队列…

    python 2023年5月19日
    00
  • 关于python pycharm中输出的内容不全的解决办法

    关于Python PyCharm中输出的内容不全的解决办法 为什么会出现输出内容不全的情况? 在Python PyCharm中,当输出的数据量过大时,交互式窗口默认只会显示一部分内容,而不会显示全部内容。这是因为为了提高交互式窗口的响应速度和稳定性,PyCharm采用了缓冲输出的方式,将输出内容保存在缓存中,而不是直接一次性输出。 如何解决输出内容不全的问题…

    python 2023年6月5日
    00
  • 不被别人察觉 Android手机的图形锁如何破解?

    对于这个问题,我作为网站作者,首先要明确一点:破解他人手机的图形锁是不道德且可能违法的行为,网站不会鼓励或者支持这种行为。在这里,我只能提供相关技术原理和可能的解决方案,而不会直接介绍破解方法。 在实际操作中,破解Android手机图形锁的方法多种多样,包括但不限于以下几种: 通过adb命令直接修改图形锁密码 这种方法需要在系统开启USB调试的情况下进行,具…

    python 2023年6月3日
    00
  • python爬虫学习笔记之Beautifulsoup模块用法详解

    Python爬虫学习笔记之Beautifulsoup模块用法详解 Beautifulsoup是Python中一个用于解析HTML和XML文档的第三方库,可以方便地从网页中提取数据。本文将详细介绍Beautifulsoup模块的用法,并提供两个示例。 安装 可以使用pip命令安装Beautifulsoup模块: pip install beautifulsou…

    python 2023年5月15日
    00
  • Python判断字符串与大小写转换

    让我们来详细讲解一下“Python判断字符串与大小写转换”的完整攻略。 判断字符串是否包含指定字符 in关键字 在Python中,要判断一个字符串中是否包含另一个字符串,最常用的方法是使用in关键字。in后面紧跟着要查找的字符,字符串中如果包含这个字符则返回True,否则返回False。 string = "hello world" if…

    python 2023年6月5日
    00
  • python实现ID3决策树算法

    下面是详细讲解“Python实现ID3决策树算法”的完整攻略,包括算法原理、Python实现和两个示例。 算法原理 ID3决树算法是一种基于信息的决策算法,其主要思想是通过计算每个特征的信息增益,选择信息增益大的特征作为当前节点划分特征,然后递归地构建决策树。具体实现时,需要计算每个特征的信息熵和条件熵,以信息增益,然后选择信息增益最大的特征进行划分。 Py…

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