6.2 构建并评价聚类模型

news/2024/5/20 7:02:00 标签: 聚类, 机器学习, 支持向量机

6.2 构建并评价聚类模型

  • 6.2.1 使用sklearn估计器构建聚类模型
    • 1、聚类的概念
    • 2、常见聚类方法
    • 3、使用sklearn估计器构建聚类模型
    • 4、sklearn估计器
    • 代码:构建K-Means聚类模型
  • 6.2.2 评价聚类模型
    • 1、FMI评价法
    • 2、轮廓系数评价法
    • 3、Calinski-Harabasz指数评价法

6.2.1 使用sklearn估计器构建聚类模型

1、聚类的概念

  • 聚类是把各不相同的个体分割为有更多相似性子集合的工作。
  • 聚类生成的子集合称为簇

聚类的要求

  • 生成的簇内部的任意两个对象之间具有较高的相似度
  • 属于不同簇的两个对象间具有较高的相异度

  聚类与分类的区别在于聚类不依赖于预先定义的类,没有预定义的类和样本——聚类是一种无监督的数据挖掘任务

  聚类的输入是一组未被标记的样本,聚类根据数据自身的距离或相似度将它们划分为若干组,划分的原则是组内(内部)距离最小化,而组外(外部)距离最大化,如下图所示。
在这里插入图片描述

2、常见聚类方法

在这里插入图片描述

3、使用sklearn估计器构建聚类模型

sklearn常用的聚类算法模块cluster提供的聚类算法及其适用范围如下所示。
在这里插入图片描述

4、sklearn估计器

  聚类算法实现需要sklearn估计器(estimator)。sklearn估计器和转换器类似,拥有fit和predict两个方法。
在这里插入图片描述

代码:构建K-Means聚类模型

from sklearn.datasets import load_iris  # 鸢尾花数据集 三分类
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler

iris = load_iris()
iris_data = iris['data']
# print(iris_data)
iris_target = iris['target']
# print(iris_target)
scale = MinMaxScaler().fit(iris_data)  # 训练规则
dataScale = scale.transform(iris_data)  # 应用规则
# print(iris_data)
kmeans = KMeans(n_clusters=3, random_state=123)  # 构建模型
kmeans.fit(dataScale)  # 训练模型
print("KMeans模型:", kmeans)

# 聚类结果可视化
import pandas as pd
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt

# 使用TSNE进行数据降维,降成二维
tsne = TSNE(n_components=2, init='random', random_state=177).fit(iris_data)
df = pd.DataFrame(tsne.embedding_)
df['labels'] = kmeans.labels_
# 提取不同的标签
df0 = df[df['labels'] == 0]
df1 = df[df['labels'] == 1]
df2 = df[df['labels'] == 2]
# 绘制图形
fig = plt.figure(figsize=(9, 6))
plt.plot(df0[0], df0[1], 'bo',
         df1[0], df1[1], 'r*',
         df2[0], df2[1], 'gD')
plt.show()  # 显示图片

在这里插入图片描述

6.2.2 评价聚类模型

  聚类评价的标准是组内的对象相互之间是相似的(相关的),而不同组中的对象是不同的(不相关的)。即组内的相似性越大,组间差别越大,聚类效果就越好。
sklearn的metrics模块提供的聚类模型评价指标。
在这里插入图片描述
  上表总共列出了6种评价的方法,其中前4种方法均需要真实值的配合才能够评价聚类算法的优劣,后2种则不需要真实值的配合。但是前4种方法评价的效果更具有说服力,并且在实际运行的过程中在有真实值做参考的情况下,聚类方法的评价可以等同于分类算法的评价。
  除了轮廓系数以外的评价方法,在不考虑业务场景的情况下都是得分越高,其效果越好,最高分值均为1。而轮廓系数则需要判断不同类别数目的情况下其轮廓系数的走势,寻找最优的聚类数目。

1、FMI评价法

# 1、使用FMI评价KMeans聚类模型
from sklearn.metrics import fowlkes_mallows_score
from sklearn.datasets import load_iris  # 鸢尾花数据集 三分类
from sklearn.cluster import KMeans
iris = load_iris()
iris_data = iris['data']
iris_target = iris['target']
for i in range(2, 7):
    # 构建并训练模型
    kmeans = KMeans(n_clusters=i, random_state=123).fit(iris_data)
    score = fowlkes_mallows_score(iris_target, kmeans.labels_)
    print('iris数据聚%d类FMI评价分值为:%f' %(i, score))

在这里插入图片描述
  iris数据聚3类的时候FMI评价分值最高,故聚类为3类的时候K-Means聚类模型最好。

2、轮廓系数评价法

  使用轮廓系数评价法评估K-Means模型,然后做出轮廓系数走势图,根据图形判断聚类效果。

# 2、使用轮廓系数评价法评价K-Means聚类模型
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris  # 鸢尾花数据集 三分类
from sklearn.cluster import KMeans
iris = load_iris()
iris_data = iris['data']
iris_target = iris['target']
si = []
for i in range(2, 15):
    kmeans = KMeans(n_clusters=i, random_state=0).fit(iris_data)  # 构建并训练模型
    score = silhouette_score(iris_data, kmeans.labels_)
    si.append(score)

plt.figure(figsize=(10, 6))
plt.plot(range(2, 15), si, linewidth=1.5)
plt.show()

在这里插入图片描述
  从图形结果可以看出,聚类数目为2、3和5、6时平均畸变程度最大。由于iris数据本身就是3种鸢尾花的花瓣、花萼长度和宽度的数据,侧面说明了聚类数目为3的时候效果最佳。

3、Calinski-Harabasz指数评价法

# 3、使用Calinski-Harabasz 指数评价K-Means聚类模型
from sklearn.metrics import calinski_harabasz_score
from sklearn.datasets import load_iris  # 鸢尾花数据集 三分类
from sklearn.cluster import KMeans
iris = load_iris()
iris_data = iris['data']
iris_target = iris['target']
for i in range(2, 7):
    # 构建并训练模型
    kmeans = KMeans(n_clusters=i, random_state=123).fit(iris_data)
    score = calinski_harabasz_score(iris_data, kmeans.labels_)
    print('iris数据聚%d类calinski_harabasz指数为:%f' % (i, score))

在这里插入图片描述
  使用Calinski-Harabasz指数评价法,分值越高,聚类效果越好。从结果可以看出3的得分最高。
  在具备真实值作为参考的情况下,几种方法均可以很好地评估聚类模型。在没有真实值作为参考的时候,轮廓系数评价方法和Calinski-Harabasz指数评价方法可以结合使用。


http://www.niftyadmin.cn/n/5040602.html

相关文章

在使用SpringBoot时遇到的异常总结(持续更新...)

文章目录 异常MyBatisjava.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint failsMybatis-Plus查询语句无故自动加条件 参考文献 因为平时在写SpringBoot项目时,总是会遇到各种各样的异常,因…

hash,ACM集训

840. 模拟散列表 目录 840. 模拟散列表 输入格式 输出格式 数据范围 输入样例: 输出样例: 解析: 841. 字符串哈希 输入格式 输出格式 数据范围 输入样例: 输出样例: 解析:字符串前缀hash法 4696…

Mysql免安装版的root密码是多少

免安装版的Mysql在初始化后root是没有密码的 1、下载免安装版Mysql 下载链接:MySQL :: Download MySQL Community Server 下载后解压 里面的目录是这样的 2、添加配置文件和系统环境 在系统变量中添加Mysql的bin的path路径 在Mysql的目录下添加my.ini配置文件 [my…

绿色科技:可持续发展的创新解决方案

标题绿色科技:可持续发展的创新解决方案 摘要引言绿色能源创新1. 太阳能和风能2. 储能技术 可再生资源管理3. 智能农业4. 循环经济 智能城市的未来5. 智能交通6. 城市感知 可持续生活方式7. 可持续建筑8. 智能家居 总结参考资料 博主 默语带您 Go to New World. ✍ …

Verilog零基础入门(边看边练与测试仿真)-状态机-笔记(7-10讲)

文章目录 第七讲第八讲第九讲第十讲 第七讲 1、最简单的状态机-三角波发生器 1、两种状态的代码: //最简单的状态机,三角波发生器; timescale 1ns/10ps module tri_gen(clk,res,d_out); input clk; input res; o…

Android Edittext 实现输入小写字母显示大写字母

可以使用setFilters方法配合InputFilter来实现这个功能 以下是一个简单的例子: EditText editText (EditText) findViewById(R.id.edit_text); InputFilter filter new InputFilter() {public CharSequence filter(CharSequence source, int start, int end, Sp…

yolov5使用最新MPDIOU损失函数,有效和准确的边界盒回归的损失,优于GIoU/EIoU/CIoU/EIoU(附代码可用)

文章目录 1. 论文1.1. 主要目的1.2. 设计思路2 代码3.总结1. 论文 MPDIoU: A Loss for Efficient and Accurate Bounding Box Regression (一个有效和准确的边界框损失回归函数) 论文地址 1.1. 主要目的 当预测框与边界框具有相同的纵横比,但宽度和高度值完全不同时,大多数…

定期清理iPad缓存,找回iPad最初的感觉!清除iPad缓存的3种方法

本文介绍了如何在任何iPad(iPadOS 15及更早版本)上删除Safari和Chrome浏览器中的应用程序缓存,以及如何在不丢失应用程序数据的情况下删除应用程序缓存。 ​如何清除iPad上的Safari缓存 如果你注意到你的iPad变得迟钝或行为不稳定&#xff…