kmeans 最佳聚类个数 | 轮廓系数(越大越好)
轮廓系数越大,表示簇内实例之间紧凑,簇间距离大,这正是聚类的标准概念。
- 簇内的样本应该尽可能相似。
- 不同簇之间应该尽可能不相似。
目的:鸢尾花数据进行kmeans聚类,最佳聚类个数是多少?
plot(iris[,1:4], col=iris$Species)

1. 标准化很重要
假设已经知道最佳是3类,
- 使用原始数据做kmeans,和原始标签不一致的很多。
- 如果做了标准化,kmeans的分类结果和原始标签一模一样。
(1). raw dat (错了好多)
dat=iris[, 1:4]
rownames(dat) = paste0("obs", 1:nrow(dat))
dat[1:3,]km_model <- kmeans( dat, centers = 3)# 获取分类结果
predictions <- km_model$cluster
table(predictions)dat$origin=iris$Species
dat$pred=predictionstable(dat$origin, dat$pred)
# 1 2 3
#setosa 0 0 50
#versicolor 48 2 0
#virginica 14 36 0plot(dat$Sepal.Length, dat$Sepal.Width, col=dat$origin, pch=19)
plot(dat$Sepal.Length, dat$Sepal.Width, col=dat$pred, pch=19)
(2). normalized dat (几乎全对)
dat=iris[, 1:4]
rownames(dat) = paste0("obs", 1:nrow(dat))
dat[1:3,]dat=apply(dat, 1, function(x){x/sum(x) * 1e4
}) |> t() |> as.data.frame()
head(dat)# 行作为观测值
km_model <- kmeans( dat, centers = 3)# 获取分类结果
predictions <- km_model$cluster
table(predictions)dat$origin=iris$Species
dat$pred=predictionstable(dat$origin, dat$pred)
# 1 2 3
#setosa 50 0 0
#versicolor 0 45 5
#virginica 0 0 50
2. 最佳分类数
(0) 预处理
dat=iris[, 1:4]
rownames(dat) = paste0("obs", 1:nrow(dat))
dat[1:3,]dat=apply(dat, 1, function(x){x/sum(x) * 1e4
}) |> t() |> as.data.frame()
head(dat)
(1) factoextra - silhouette: n=2
library(factoextra)
tmp = factoextra::fviz_nbclust( dat, kmeans, method = "silhouette")
#str(tmp)
tmp #图# fviz_nbclust(dat, kmeans, method = "silhouette", k.max = 20)

(2) 碎石图: n=2
# 在一个循环中进行15次的kmeans聚类分析
{
totalwSS=vector(mode = "numeric", 15)
for (i in 1:15){t1= kmeans(dat, i)totalwSS[i] <- t1$tot.withinss
}
# 聚类碎石图 - 使用plot函数绘制total_wss与no-of-clusters的数值。
plot(x=1:15, # x= 类数量, 1 to 15totalwSS, #每个类的total_wss值col="navy", lwd=2,type="b" # 绘制两点,并将它们连接起来
)
}

(3) silhouette 画图: n=2?
逐个画:
# 逐个画轮廓系数
library(cluster)
dis = dist(dat) #行之间的距离
#
n=3
kclu <- kmeans(dat, centers = 3, nstart=25)
kclu.sil=sortSilhouette( silhouette(kclu$cluster, dist = dis) )
plot(kclu.sil, col =1:n, #c("red", "orange", "blue"), main="")#
n=4
#library(cluster)
#dis = dist(dat) #行之间的距离
kclu <- kmeans(dat, centers = n, nstart=25)
kclu.sil=sortSilhouette( silhouette(kclu$cluster, dist = dis) )
plot(kclu.sil, col =1:n, # c("red", "orange", "blue"), main="")
#
#
n=8
#library(cluster)
#dis = dist(dat) #行之间的距离
kclu <- kmeans(dat, centers = n, nstart=25)
kclu.sil=sortSilhouette( silhouette(kclu$cluster, dist = dis) )
plot(kclu.sil, col =1:n, # c("red", "orange", "blue"), main="")
#

批量计算:
silhouette_score <- function(k){km <- kmeans(dat, centers = k, nstart=25)ss <- silhouette(km$cluster, dist(dat))mean(ss[, 3])
}
k <- 2:15
avg_sil <- sapply(k, silhouette_score)
plot(k, avg_sil, type='b',xlab='Number of clusters', ylab='Average Silhouette Scores', frame=FALSE)

最大是2,其次是3类。
根据本文图1,忽略颜色,只看数值分布,确实最佳是2类。
用标准化后的数据呢?
plot(dat, col=iris$Species, main="Normalized data")

plot(dat,main="Normalized data")
结论不变:如果忽略颜色,依旧是很清晰的2类。

(4) pam 是一种更稳定的 kmeans
Partitioning Around Medoids:
Partitioning (clustering) of the data into k clusters “around medoids”, a more robust version of K-means.
# 最佳分类数:
Ks=sapply(2:15, function(i){summary(silhouette(pam(dat, k=i)))$avg.width
})
plot(2:15,Ks,xlab="k",ylab="av. silhouette",type="b", pch=19)效果:
t1=pam(dat, k=3)
> table(t1$clustering, iris$Species) setosa versicolor virginica1 50 0 02 0 44 03 0 6 50
还是有几个错的。
End
相关文章:
kmeans 最佳聚类个数 | 轮廓系数(越大越好)
轮廓系数越大,表示簇内实例之间紧凑,簇间距离大,这正是聚类的标准概念。 簇内的样本应该尽可能相似。不同簇之间应该尽可能不相似。 目的:鸢尾花数据进行kmeans聚类,最佳聚类个数是多少? plot(iris[,1:4…...
【纪念365天】我的创作纪念日
过去的一年 没有注意加入csdn已经有一年了。 这几天翻看小猴儿的通知才发现时间来到了一年的纪念日。稍稍思索想要将这一段时间的学习到的知识以及偶然遇到的机遇做一下总结。 上一次写纪念日是来到csdn128天的时候, 200天前我的学习状态是非常疯狂的。 只记得我当时…...
Opencv+ROS实现颜色识别应用
目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像:RGB(红,绿,蓝) HSV图像:H࿰…...
蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)
别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! ! ! 关注博主,更多蓝桥杯nice题目静待更新:) 动态规划 三、括号序列 【问题描述】 给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合…...
C++设计模式(单例模式)
一、介绍 1.动机 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才能确保它们的逻辑正确性、以及良好的效率。 如何绕过常规的构造器,提供一种机制来保证一个类只有一个实例? 这应该是类设计者的…...
前端---CSS(部分用法)
HTML画页面--》这个页面就是页面上需要的元素罗列起来,但是页面效果很差,不好看,为了让页面好看,为了修饰页面---》CSS CSS的作用:修饰HTML页面 用了CSS之后,样式和元素本身做到了分离的效果。---》降低了代…...
2024年最新版Java八股文复习
最新版本Java八股文复习,每天更新一篇,博主正在持续努力更新中~~~ 一、Java基础篇1、怎么理解面向对象?简单说说封装、继承、多态三大特性?2、多态体现在哪几个方面?3、面向对象的设计原则你知道有哪些吗?4…...
计算机毕业设计Hadoop+Spark音乐推荐系统 音乐预测系统 音乐可视化大屏 音乐爬虫 HDFS hive数据仓库 机器学习 深度学习 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
MyBatis高级扩展
一、Mapper批量映射优化: 1.需求: Mapper 配置文件很多时,在全局配置文件中一个一个注册太麻烦,希望有一个办法能够一劳永逸 2.配置方式: Mybatis允许在指定Mapper映射文件时,只指定其所在的包: <mappers><package name"c…...
代码美学2:MATLAB制作渐变色
效果: %代码美学:MATLAB制作渐变色 % 创建一个10x10的矩阵来表示热力图的数据 data reshape(1:100, [10, 10]);% 创建热力图 figure; imagesc(data);% 设置颜色映射为“cool” colormap(cool);% 在热力图上添加边框 axis on; grid on;% 设置热力图的颜色…...
浅谈- “ 变量中 无符号 与 有符号 的 值转换 ”
在同一个表达式中,若同时出现 无符号变量 与 有符号变量 : 1、都转换为无符号类型:(注:2^324294967296)即unsigned int 的最大值 2、然后再运行表达式 实例: #include <stdio.h>char fun(…...
【AI绘画】Midjourney进阶:色调详解(上)
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯Midjourney中的色彩控制为什么要控制色彩?为什么要在Midjourney中控制色彩? 💯色调白色调淡色调明色调 💯…...
代码管理之Gitlab
文章目录 Git基础概述场景本地修改未提交,拉取远程代码修改提交本地,远程已有新提交 GitIDEA引入Git拉取仓库代码最后位置 Git基础 概述 workspace 工作区:本地电脑上看到的目录; repository 本地仓库:就是工作区中隐…...
防御网络攻击的创新策略
关键要点 ● 了解各种类型的网络攻击对于组织加强防御至关重要。 ● 制定敏捷的网络安全策略可帮助企业快速应对新出现的威胁。 ● 跨行业协作和威胁情报共享可以增强整体安全性。 网络攻击威胁日益严重 网络攻击的数量和复杂程度急剧增加,对全球组织构成了重大…...
C++软件设计模式之组合模式概述
组合模式(Composite Pattern)是C软件设计模式中的一种,主要用于解决对象的层次结构问题。它允许你将对象组合成树形结构来表示“部分-整体”的层次结构,使得客户端可以统一地处理单个对象和组合对象。 主要用于解决的问题&#x…...
利用HTML5和CSS来实现一个漂亮的表格样式
利用HTML5和CSS来实现一个漂亮的表格样式 第一步:创建HTML结构第二步:添加CSS样式第三步:响应式设计第四步:加入交互效果 第一步:创建HTML结构 我们将用HTML创建一个基本的表格结构。代码如下: <!DOCT…...
Vivado程序固化到Flash
在上板调试FPGA时,通常使用JTAG接口下载程序到FPGA芯片中,FPGA本身是基于RAM工艺的器件,因此掉电后会丢失芯片内的程序,需要重新烧写程序。但是当程序需要投入使用时不能每一次都使用JTAG接口下载程序,一般FPGA的外围会…...
HCIA笔记3--TCP-UDP-交换机工作原理
1. tcp协议 可靠的连接 1.1 报文格式 1.2 三次握手 1.3 四次挥手 为什么TIME_WAIT需要2MSL的等待时间? (a) 为了实现可靠的关闭 (b)为了让过期的报文在网络上消失 对于(a), 假设host发给server的last ack丢了。 ser…...
计算机网络的功能
目录 信息交换 资源共享 分布式处理 可靠性增强 集中管理 信息交换 计算机网络最基本的功能之一是允许不同设备之间的数据通信。这包括电子邮件的发送和接收、即时消息的传递、文件传输等。通过网络,用户可以轻松地与全球各地的其他人进行沟通和协作。 信息交…...
Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)
14.1 命令请求的执行过程 一个命令请求从发送到获得回复的过程中,客户端和服务器都需要完成一系列操作。 14.1.1 发送命令请求 当用户在客户端中输入一个命令请求的时候,客户端会把这个命令请求转换为协议格式,然后通过连接到服务器的套接字…...
Claude Code安装保姆级教程!超简单上手就会!
Claude Code驾驶手册 文章目录 Claude Code驾驶手册0 前言1 Claude Code基本安装配置1.1 系统配置及安装1.2 启动Claude Code1.3 配置API 0 前言 AI Agent 称为智能体(或人工智能代理),本质是自动执行任务的程序,核心在于让模型不…...
网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案
网易云音乐无损音乐下载器:5分钟搞定你的私人音乐库终极方案 【免费下载链接】NeteaseCloudMusicFlac 根据网易云音乐的歌单, 下载flac无损音乐到本地.。 项目地址: https://gitcode.com/gh_mirrors/nete/NeteaseCloudMusicFlac 还在为网易云音乐的无损音乐无…...
OpenClaw长期运行秘诀:GLM-4.7-Flash任务守护与自动恢复机制
OpenClaw长期运行秘诀:GLM-4.7-Flash任务守护与自动恢复机制 1. 为什么需要长期运行方案? 去年冬天的一个深夜,我被手机警报惊醒——OpenClaw在连续处理300多份文档后突然崩溃,导致凌晨的自动化报表任务全部中断。这次事故让我意…...
010Editor逆向实战:从爆破到算法还原的完整通关指南(附注册机源码)
010Editor逆向工程深度解析:从关键跳转定位到注册机实现 1. 逆向工程基础与工具链搭建 逆向工程作为软件安全领域的核心技术,要求分析者具备扎实的汇编语言基础和系统级编程经验。在进行010Editor逆向分析前,需要构建完整的工具链环境&#x…...
构建高可用Chatbot UI完整模板:从架构设计到生产环境部署
痛点分析:Chatbot UI开发中的那些“坑” 在动手开发一个Chatbot UI之前,我们得先聊聊那些让开发者头疼的常见问题。如果你做过类似项目,下面这些场景一定不陌生: 状态管理失控:对话历史、用户输入、AI回复状态、连接…...
手把手教你理解永磁同步电机的Clark与Park变换(附MATLAB仿真代码)
手把手教你理解永磁同步电机的Clark与Park变换(附MATLAB仿真代码) 在工业自动化与电动汽车驱动领域,永磁同步电机(PMSM)凭借其高功率密度和卓越的动态性能,已成为现代运动控制系统的核心部件。然而…...
ArcGIS模型构建器实战:一键加载上百个SHP文件(含子文件夹)的保姆级教程
ArcGIS模型构建器实战:一键加载上百个SHP文件(含子文件夹)的保姆级教程 当你在城市规划部门接手一个历史遗留项目,或是从不同合作方收到几十个分散的SHP文件时,是否经历过这样的崩溃瞬间?每个文件夹挨个点开…...
AI科学发现新范式!NSR综述知识图谱应用全解(非常详细),从入门到精通,收藏这一篇就够了!
在生物、化学、材料等数据密集型科学领域,海量实验数据与文献知识不断积累,但这些知识往往分散在不同数据库与研究论文中,难以被系统整合与有效利用。科学知识图谱(Scientific Knowledge Graphs, SciKGs)通过结构化方式…...
Chatbox 连接火山引擎 ModelNotOpen 实战指南:从零搭建到生产环境部署
作为一名开发者,你是否也曾对构建一个能与自己实时对话的AI应用心驰神往?想象一下,一个能听懂你说话、理解你意图、并用自然声音回应你的数字伙伴。这听起来像是未来科技,但实际上,利用现有的强大工具,我们…...
ChatTTS角色系统:从技术原理到生产环境部署指南
在语音合成技术日益成熟的今天,多角色、高表现力的TTS系统已成为互动应用的关键组件。ChatTTS的角色系统允许在同一对话流中动态切换不同音色的语音输出,极大地提升了交互的自然度和沉浸感。然而,在实际生产部署中,开发者常面临一…...
