1.13 - 动手学聚类算法

news/2024/11/18 9:29:38/文章来源:https://www.cnblogs.com/zhangzhenw/p/18349581

1. 基于距离的k-means聚类,需要人工提供聚簇数量K

1.1 通过肘方法确定最佳聚簇数量

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs, load_iris
from sklearn.metrics import silhouette_score
import warningswarnings.filterwarnings("ignore")
np.printoptions(suppress=True)# 解决中文乱码
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False# 1. 获取待聚簇数据
# 对鸢尾花数据集进行聚簇(众所周知,该数据有三类花朵)
X = load_iris(return_X_y=False).data
# 生成高斯聚簇分布的数据点, n_feature-样本特征数量; n_sample-样本数量
# X, y = make_blobs(n_samples=1500, n_features=2, centers=4, random_state=170)# 2. 对待聚类数据归一化,不归一化,有的特征 数据过大会影响求解方差和最终聚簇结果。
x = StandardScaler().fit_transform(X)# 3. 肘方法
scores1 = []
scores2 = []
for i in range(2, 8):# 通过 k-means 方法初始化聚簇质心,并重复实验 n_init 次,防止初始聚簇质心不好陷入局部最优model = KMeans(n_clusters=i, init='k-means++', n_init=10)model.fit(x)# model.cluster_centers_  # 查看聚簇质心# 1)按照轮廓系数选取最佳聚簇数K, 轮廓系数越大越好y = model.labels_  # 每个数据最终归纳到哪个簇score1 = silhouette_score(x, y)# 2)按照 聚簇方差损失 选取最佳聚簇数量,聚簇方差越小越好score2 = model.inertia_  # 各个点的聚簇方差总和
scores1.append(score1)scores2.append(score2)# 作图查看
plt.figure(num=1)
plt.plot(range(2, 8), scores1)
plt.xlabel("聚簇数量")
plt.ylabel("轮廓系数")
plt.title("肘方法 - 轮廓系数")plt.figure(num=2)
plt.plot(range(2, 8), scores2)plt.xlabel("聚簇数量")
plt.ylabel("所有数据点的方差和")
plt.title("肘方法 - 所有样本点聚簇方差总和")# 显示图形
plt.show()

 

分析

  1)对于容易聚类的数据集如人工生成的,通过 轮廓系数和聚簇方差 都比较容易的选出最佳聚簇数K;但是对于比较难区分的数据集如鸢尾花数据集,很难看出来是三个簇。

  2)上述代码实现,聚簇方差因为是每个样本点的方差总和,所以实际选取的最佳聚簇数K应该是 损失比较平滑的起点,而不是原理中的什么 幅度最大的那个。( 看图 )

VS

2. 基于密度的 DBSCAN 聚类

  相比于前面的聚类方法,基于密度的聚类,如果超参数选好了效果还是相当不错的,但是一般选不好。所以 常用上面两个聚类而不用密度聚类。如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs, load_iris
from sklearn.metrics import silhouette_score
import warningswarnings.filterwarnings("ignore")
np.printoptions(suppress=True)x_iris = load_iris(return_X_y=False).data
x_gauss, y = make_blobs(n_samples=1500, n_features=2, centers=4, random_state=170)x_iris = StandardScaler().fit_transform(x_iris)
x_gauss = StandardScaler().fit_transform(x_gauss)model = DBSCAN(eps=0.5, min_samples=5)
labels_iris = model.fit_predict(x_iris)
labels_gauss = model.fit_predict(x_gauss)print('DBSCAN算法在鸢尾花数据集上最终聚簇为{}类'.format(len(np.unique(labels_iris))))  # 3 簇
print('DBSCAN算法在人生生成Gauss数据集上最终聚簇为{}类'.format(len(np.unique(labels_gauss))))  # 2 簇

分析:最终鸢尾花聚簇数为 3,人工生成Gauss分布数据集聚簇数为 2 ,显然很扯淡。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/779949.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux C++ 开发2 - 编写、编译、执行第一个程序

上一篇《Linux C++ 开发1 - 搭建C++开发环境》我们搭建好了C++的开发环境,本篇我们将编写、编译、执行第一个程序。 1. 第一个C++程序 1.1. demo01.cpp 这里写一个最简单的HelloWord程序 #include <iostream>int main() {std::cout << "Hello, world!" …

洛谷P1194 买礼物之警钟敲爆

洛谷P1194题解传送锚点摸鱼环节 买礼物 题目描述 又到了一年一度的明明生日了,明明想要买 \(B\) 样东西,巧的是,这 \(B\) 样东西价格都是 \(A\) 元。 但是,商店老板说最近有促销活动,也就是: 如果你买了第 \(I\) 样东西,再买第 \(J\) 样,那么就可以只花 \(K_{I,J}\) 元…

CSP16

这题,唯一坑点,子序列是不连续的 注意,子序列可以不连续,子串必须连续。 有一个很显然的暴力点击查看代码 int dp[N][N],n,p[N],q[N]; int main() {speed();freopen("in.in","r",stdin);freopen("out.out","w",stdout);cin>>n…

潜在新就业岗位超300万个 原生鸿蒙开发创造百万级人才缺口

在数字化转型的浪潮中,开发者作为数字经济的建设者和创新者,成为了推动社会进步的重要⼒量。InfoQ 研究中⼼最新发布的《中国开发者画像洞察研究报告2024》显示,截至2023年年底,中国泛开发者⼈数高达2067.21万,增速为2.5%。在这2000多万人中,鸿蒙⽣态吸引了超过254万开发…

python numpy

import numpy as np a=np.array([1,2,3,4]) b=np.array([5,6,7,8]) #相应项相乘再相加 print(np.inner(a,b)) #a的每一项乘以b的每一项组成新的矩阵 print(np.outer(a,b))

开发者洞察报告:百万级鸿蒙岗位缺口,开发者薪资涨幅43.1%

最近,极客邦科技双数研究院InfoQ研究中心《中国开发者画像洞察研究报告2024》正式发布,分析了开发者群体在数字经济浪潮中的新趋势与显著变化。根据《国资委79号文件》指示,2027年底,全部国央企必须完成信息化系统的信创改造。而HarmonyOS系统作为国产自研信创软件的代表,…

CH6 CH7

CH-6 时间与窗口 6.1 时间语义事件时间(Event Time):数据产生的时间,默认使用处理时间(Processing Time):数据到达窗口的时间摄入时间:被Flink Source读入的时间6.2 水位线 6.2.1 逻辑时钟 在使用事件时间时,Flink使用逻辑时钟对数据进行窗口计算。逻辑时钟依靠数据的时间…

CH2~CH5

一个Flink程序,就是对DataStream进行各种转换。基本上由以下几部分构成接下来分别从执行环境、数据源、转换操作、输出四大部分,介绍DataStream API。 导入Scala DataStream Api import org.apache.flink.streaming.api.scala._CH-5 DataStream API基础 一、执行环境 1.1 创建…

中国式报表搞不定?告诉你如何轻松解决

中国式报表,顾名思义,是一种在中国企业中广泛使用的报表格式。这种报表通常格式复杂、数据量大、数据层次多,涵盖了从基本数据到高层分析的各个层面。每一个字段都可能代表着不同的含义,每一列数据都有着深厚的背景,这让很多报表工具望而却步。然而,要想在中国企业中高效…

git的快速入门(含常用指令)

目录概念什么是gitgit与GitHub有什么区别提交、仓库、分支git的使用从GitHub上下载别人的代码直接将代码下载到本地克隆仓库获取代码将自己的代码上传到GitHub 本文拟将用通俗的语言描述git的使用方法,如有出入,请批评指正 概念 什么是git Git可以想象成一个超级高效的"…

最全MySQL面试20题和答案(二)

接第一期的MySQL面试二十题,这是之后的20题!索引百万级别或以上的数据如何删除? 关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加、修改、删除都会产生额外的对索引文件的操,这些操作需要消耗额外的IO,会降低增/改/删的执行…

Spring关于bean的一些基本知识

介绍了bean所需要关注的一些基本知识,掌握这些知识应该大体上可以满足信息应用开发在spring这座大厦中,去除掉最底部的核心(core)组件,那么最重要的无疑是bean和bean工厂。 剩余是AOP、设计模式,更之上的就是各种组件:DATA,WEBMVC...为了便于行文,这里把bean和bean工厂…