Python如何通过手肘法实现k_means聚类详解

Python如何通过手肘法实现k_means聚类详解

什么是 k-Means 聚类

k-Means 是一种常见的聚类算法,它将 n 个数据点分成 k 个集群,使得每个点都属于其所属集群的平均值,又称为质心。一个样本点最终将会归属到距离其最近的质心所属的集群中。这也意味着,如果聚类效果不佳,任意两个聚类之间的距离会非常接近,欠拟合或过拟合。

手肘法

k-Means 聚类中的 k 值如何选取是一个非常重要的问题。可以使用统计机器学习中的手肘法来选择 k 值。

手肘法的基本思路是,对于不同的 k 值,计算各个数据点到其所属聚类中心的距离的平方和,然后选择“肘部”处对应的 k 值作为数据进行聚类的 k 值。

找到“肘部”的方法是,将每个 k 值下的误差值用图表表示。观察图表,对于 k 值,它的错误值在达到某个值之后,将不再显著降低,这个地方就是“肘部”。

代码示例

以下是 Python 代码示例,展示了如何使用 k-Means 聚类和手肘法来完成聚类。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans

# 生成聚类数据
X = np.array([
    [1, 2],
    [1, 4],
    [1, 0],
    [4, 2],
    [4, 4],
    [4, 0]
])

# 用 KMeans 聚类算法进行聚类
wcss = []
for i in range(1, 7):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

# 分析手肘法
plt.plot(range(1, 7), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

上面代码示例中,我们生成了一个数据集,其中包含两个特征的六个数据点。我们然后使用 k-Means 聚类算法将其聚类为两个聚类。接着,我们使用手肘法绘制出 k 值区间[1,6]下的错误值变化图,并通过观察图形找到了一个折点,即分界点,这个分别点为 2。

下面的示例中,我采用一个真实的数据集完成 k-Means 聚类,还展示了如何使用手肘法决定 k 值。这个数据集是红酒数据集中的一份子,它包含 13 个特征和 178 个观测值。

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans

# 加载数据
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data'
df = pd.read_csv(url, header=None)
X = df.iloc[:, 1:].values

# 使用手肘法选择 k 值
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)

# 可视化手肘法
plt.plot(range(1, 11), wcss)
plt.title('The elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

# 使用 k = 3 进行聚类
kmeans = KMeans(n_clusters=3, init='k-means++', max_iter=300, n_init=10, random_state=0)
y_kmeans = kmeans.fit_predict(X)

上述代码示例加载了红酒数据集。然后使用 KMeans 算法计算 k 值区间[1,10]下的误差平方和。根据可视化的手肘法曲线,结果显示最优 k 值。

最终,我们使用 k = 3 对数据集进行聚类。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python如何通过手肘法实现k_means聚类详解 - Python技术站

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

相关文章

  • 说一说Python logging

    Python logging 是 Python 官方提供的日志模块,它可以帮助开发者更好地记录应用程序运行过程中的日志信息。下面是 Python logging 的完整攻略。 logging 模块简介 logging 模块旨在提供标准的 Python 日志记录接口。logging 模块可以将日志消息发送到多个的目的地,如控制台、文件、邮件、网络等。同时,开发…

    python 2023年6月3日
    00
  • Python:获取文件的数字签名信息

    【问题标题】:Python: Get digital signiture information for a filePython:获取文件的数字签名信息 【发布时间】:2023-04-02 03:02:01 【问题描述】: 我希望利用 Python 创建一个脚本,用于在指定文件安装后检查其数字签名和版权信息。 有人有什么想法吗?我已经尝试使用 win32f…

    Python开发 2023年4月8日
    00
  • python中多层嵌套列表的拆分方法

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

    python 2023年5月13日
    00
  • Python3生成手写体数字方法

    Python3生成手写体数字方法完整攻略 简介 在机器学习中,手写体数字是一个经典的数据集,因此在自然语言处理和图像识别等领域需要生成手写数字来模拟各种场景。由于现成模板数量较少,因此需要一种方法来生成手写数字。 解决方案 通过使用Python3,我们可以使用TensorFlow和MNIST数据集生成手写数字的图像。 步骤 1:安装TensorFlow 打开…

    python 2023年6月3日
    00
  • Python入门篇之对象类型

    Python入门篇之对象类型 在Python中,对象是基础,一切都是对象。在Python中,一切对象都具有类型。Python具有丰富的数据类型,包括数字、字符串、列表、元组、字典等。 数字类型 Python中支持多种数字类型,包括整型(int)、浮点型(float)、复数(complex)等。Python还支持常见的数学运算符,如加减乘除、乘方、取余等。 下…

    python 2023年5月14日
    00
  • Python 发送邮件方法总结

    Python 发送邮件是一项非常常用的操作,本文将对 Python 发送邮件的方法进行详细、全面的介绍,包括邮件的基本原理、Python 发送邮件的三种方法以及常见错误及解决方案。 邮件的基本原理 在介绍 Python 发送邮件的方法前,我们需要了解邮件发送的基本过程和原理。邮件发送的过程可以简单归纳为以下几个步骤: 用户通过邮件客户端编写邮件,并提交邮件到…

    python 2023年6月5日
    00
  • Python+pyecharts绘制交互式可视化图表

    下面是我对“Python+pyecharts绘制交互式可视化图表”的完整攻略。 一、什么是pyecharts pyecharts是一款基于Echarts 3.x和Python编写的图表库。它能够快速简单地绘制出各种交互式可视化图表,支持30+种图表类型,包括但不限于折线图、柱状图、散点图、地图等,还可以进行多种配置和样式的自定义。 二、pyecharts的安…

    python 2023年6月6日
    00
  • 解决Python复杂zip文件的解压问题

    下面是“解决Python复杂zip文件的解压问题”的完整攻略。 问题描述 在Python中使用zipfile模块解压较为简单的zip文件时,可以简单地使用如下代码: import zipfile zip_ref = zipfile.ZipFile(‘file.zip’, ‘r’) zip_ref.extractall(‘target_dir’) zip_re…

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