20240325-2-K-means面试题

在这里插入图片描述

K-means面试题

1. 聚类算法(clustering Algorithms)介绍

聚类是一种无监督学习—对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小。

聚类算法可以分为原型聚类(k均值算法(K-means)、学习向量量化、(Learning Vector Quantization -LVQ)、高斯混合聚类(Mixture-of-Gaussian),密度聚类(DBSCAN),层次聚类(AGNES)等。

2. kmeans原理详解

K-means是一种常见的聚类算法,也叫k均值或k平均。通过迭代的方式,每次迭代都将数据集中的各个点划分到距离它最近的簇内,这里的距离即数据点到簇中心的距离。

kmean步骤:

  1. 随机初始化k个簇中心坐标
  2. 计算数据集内所有点到k个簇中心的距离,并将数据点划分近最近的簇
  3. 更新簇中心坐标为当前簇内节点的坐标平均值
  4. 重复2、3步骤直到簇中心坐标不再改变(收敛了)

3. 优缺点及改进算法

优点:效率高、适用于大规模数据集

缺点改进描述
k值的确定ISODATA当属于某个簇的样本数过少时把这个簇去除,
当属于某个簇的样本数过多、分散程度较大时把这个簇分为两个子簇
对奇异点敏感k-median中位数代替平均值作为簇中心
只能找到球状群GMM以高斯分布考虑簇内数据点的分布
分群结果不稳定K-means++初始的聚类中心之间的相互距离要尽可能的远

4. k值的选取

K-means算法要求事先知道数据集能分为几群,主要有两种方法定义k。

  • 手肘法:通过绘制k和损失函数的关系图,选拐点处的k值。

  • 经验选取人工据经验先定几个k,多次随机初始化中心选经验上最适合的。

通常都是以经验选取,因为实际操作中拐点不明显,且手肘法效率不高。

5. K-means算法中初始点的选择对最终结果的影响

K-means选择的初始点不同获得的最终分类结果也可能不同,随机选择的中心会导致K-means陷入局部最优解。

6. 为什么在计算K-means之前要将数据点在各维度上归一化

因为数据点各维度的量级不同。
举个例子,最近正好做完基于RFM模型的会员分群,每个会员分别有R(最近一次购买距今的时长)、F(来店消费的频率)和M(购买金额)。如果这是一家奢侈品商店,你会发现M的量级(可能几万元)远大于F(可能平均10次以下),如果不归一化就算K-means,相当于F这个特征完全无效。如果我希望能把常客与其他顾客区别开来,不归一化就做不到。

7. K-means不适用哪些数据

  1. 数据特征极强相关的数据集,因为会很难收敛(损失函数是非凸函数),一般要用kernal K-means,将数据点映射到更高维度再分群。
  2. 数据集可分出来的簇密度不一,或有很多离群值(outliers),这时候考虑使用密度聚类。

8. K-means 中常用的距离度量

K-means中比较常用的距离度量是欧几里得距离和余弦相似度。

9. K-means是否会一直陷入选择质心的循环停不下来(为什么迭代次数后会收敛)?

从K-means的第三步我们可以看出,每回迭代都会用簇内点的平均值去更新簇中心,所以最终簇内的平方误差和(SSE, sum of squared error)一定最小。 平方误差和的公式如下:
L ( X ) = ∑ i = 1 k ∑ j ∈ C i ( x i j − x i ˉ ) 2 L(X) = \sum_{i=1}^{k}{\sum_{j\in C_i}{(x_{ij}-\bar{x_i})^2}} L(X)=i=1kjCi(xijxiˉ)2

10. 聚类和分类区别

  1. 产生的结果相同(将数据进行分类)
  2. 聚类事先没有给出标签(无监督学习)

11. 如何对K-means聚类效果进行评估

回到聚类的定义,我们希望得到簇内数据相似度尽可能地大,而簇间相似度尽可能地小。常见的评估方式:

名称公式含义如何比较
sum of squares within clusters(SSW) ∑ i = 1 K ∥ x i − c l i ∥ 2 \sum_{i=1}^{K}{ \parallel x_i-c_{l_i} \parallel ^2} i=1Kxicli2所有簇内差异之和越小越好
sum of squares between clusters(SSB) ∑ i = 1 K n i ∥ c i − x ˉ ∥ 2 \sum_{i=1}^{K}{n_i \parallel c_i-\bar{x} \parallel ^2} i=1Knicixˉ2簇心与簇内均值差异的加权和越大越好
Calinski-Harabasz S S B K − 1 S S W N − K \frac{\frac{SSB}{K-1}}{\frac{SSW}{N-K}} NKSSWK1SSB簇间距离和簇内距离之比(除数是惩罚项,因为SSW下降地比较快)越大越好
Ball&Hall S S W K \frac{SSW}{K} KSSW几乎同SSW越小越好
Dunn’s index min ⁡ i = 1 M min ⁡ j = i + 1 M d ( c i , c j ) max ⁡ k = 1 M d i a m ( c k ) \frac{\min_{i=1}^M{\min_{j=i+1}^M{d(c_i, c_j)}}}{\max_{k=1}^M{diam(c_k)}} maxk=1Mdiam(ck)mini=1Mminj=i+1Md(ci,cj)
w h e r e d ( c i , c j ) = min ⁡ x ∈ c i , x ′ ∈ c j ∥ x − x ′ ∥ 2 a n d where d(c_i, c_j)=\min_{x \in c_i, x' \in c_j}{\parallel x-x' \parallel}^2 and whered(ci,cj)=minxci,xcjxx2and
d i a m ( c k ) = max ⁡ x , x ′ ∈ c k ∥ x − x ′ ∥ 2 diam(c_k)=\max_{x, x' \in c_k}{\parallel x-x' \parallel}^2 diam(ck)=maxx,xckxx2
本质上也是簇间距离和簇内距离之比越大越好

另一个常见的方法是画图,将不同簇的数据点用不同颜色表示。这么做的好处是最直观,缺点是无法处理高维的数据,它最多能展示三维的数据集。
如果维数不多也可以做一定的降维处理(PCA)后再画图,但会损失一定的信息量。

聚类算法几乎没有统一的评估指标,可能还需要根据聚类目标想评估方式,如对会员作分群以后,我想检查分得的群体之间是否确实有差异,这时候可以用MANOVA计算,当p值小于0.01说明分群合理。

12. K-means中空聚类的处理

如果所有的点在指派步骤都未分配到某个簇,就会得到空簇。如果这种情况发生,则需要某种策略来选择一个替补质心,否则的话,平方误差将会偏大。一种方法是选择一个距离当前任何质心最远的点。这将消除当前对总平方误差影响最大的点。另一种方法是从具有最大SEE的簇中选择一个替补的质心。这将分裂簇并降低聚类的总SEE。如果有多个空簇,则该过程重复多次。另外编程实现时,要注意空簇可能导致的程序bug。

参考资料

  1. Mann A K, Kaur N. Review paper on clustering techniques[J]. Global Journal of Computer Science and Technology, 2013.
  2. https://blog.csdn.net/hua111hua/article/details/86556322
  3. REZAEI M. Clustering validation[J].

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零自制docker-8-【构建实现run命令的容器】

文章目录 log "github.com/sirupsen/logrus"args...go moduleimport第三方包失败package和 go import的导入go build . 和go runcli库log.SetFormatter(&log.JSONFormatter{})error和nil的关系cmd.Wait()和cmd.Start()arg……context.Args().Get(0)syscall.Exec和…

X86汇编速成

平时用的电脑都是X86的,但是现在大家都在搞RISC-V,计组也都开始以RISC-V作为示例,所以专门回头来补一下X86的汇编,方便平时使用。 寄存器register X86_64中一共有16个64位的通用寄存器,分别为: RAX, RBX,…

分享一款嵌入式开源按键框架代码工程MultiButton

目录 1 工程简介 2 工程代码分析 3 工程代码应用 4 思考 1 工程简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块。 Github地址:https://github.com/0x1abin/MultiButton 这个项目非常精简,只有两个文件: (1&am…

前端layui自定义图标的简单使用

iconfont-阿里巴巴矢量图标库 2. 3. 4.追加新图标 5.文件复制追加新图标

OSPF实验

需求: 1、R1-R3为区域0,R3到R4为区域1;其中R3的环回也在区域0,P1-R3分别有一个环回接口 2、R1-R3 R3为DR设备,没有BDR 3、R4环回地址已固定,其他所有网段使用192.168.1.0/24进行合理分配 4、R4环回不能…

鸿蒙ArkUI声明式学习:【UI资源管理】

OpenHarmony 应用的资源分类和资源的访问以及应用开发使用的像素单位以及各单位之间相互转换的方法。 资源分类 移动端应用开发常用到的资源比如图片,音视频,字符串等都有固定的存放目录,OpenHarmony 把这些应用的资源文件统一放在 resourc…

Golang中的上下文-context包的简介及使用

文章目录 简介context.Background()上下文取消函数上下文值传递建议Reference 简介 Go语言中的context包定义了一个名为Context的类型,它定义并传递截止日期、取消信号和其他请求范围的值,形成一个链式模型。如果我们查看官方文档,它是这样说…

6.10物联网RK3399项目开发实录-驱动开发之SPI接口的使用(wulianjishu666)

嵌入式实战开发例程,珍贵资料,开发必备: 链接:https://pan.baidu.com/s/1149x7q_Yg6Zb3HN6gBBAVA?pwdhs8b SPI 使用 SPI 简介 SPI 是一种高速的,全双工,同步串行通信接口,用于连接微控制器、…

拥有自己的云环境-域名及备案

序 唠叨两句 之前的文章,讲了如何购买一台云服务器,然后购买之后,如何操作云服务器。当买完云服务器之后,我们就可以使用云服务器提供的公网ip,访问到我们的服务器上。但是,这样怎么能体现我们一个老程序…

第十四届蓝桥杯岛屿个数

题目描述: 小蓝得到了一副大小为 MN 的格子地图,可以将其视作一个只包含字符 0(代表海水)和 1(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右四个方向上…

使用 AI 生成正则表达式,告别正则烦恼

如果你有处理正则表达式的需求,那么这个网站(autoregex.xyz)一定要收藏好。 可以根据文字描述生成正则表达式。 默认是从文字到正则,不用选择。 输入框中输入描述,点击 ”GO“ 按钮。 等待一会儿,即可生…

测试开发面经(Flask,轻量级Web框架)

1. Flask的核心特点 a. 轻量级:核心简洁,只提供了基本的功能,其他高级功能可以通过插件或扩展来添加。 b. 灵活性:允许开发者选择适合自己项目的组件和工具,没有强制的项目结构和设计模式。 c. 易于扩展:提…

搭建python编译环境

目录 1.安装依赖包 2.安装失败进行换源 3. 更新系统 通过C 语言调用 Python 代码,需要先安装 libpython3 的 dev 依赖库(不同的 ubuntu 版本下, python 版本 可能会有差异, 比如ubuntu 22.04 里是 libpython3.10-dev &#xff09…

javaScript手写专题——实现instanceof/call/apply/bind/new的过程/继承方式

目录 原型链相关 手写instanceof 实现一个_instance方法,判断对象obj是否是target的实例 测试 手写new的过程 实现一个myNew方法,接收一个构造函数以及构造函数的参数,返回构造函数创建的实例对象 测试myNew方法 手写类的继承 ES6&…

人民大学:揭示大语言模型事实召回的关键机制

引言:大语言模型事实召回机制探索 该论文深入研究了基于Transformer的语言模型在零射击和少射击场景下的事实记忆任务机制。模型通过任务特定的注意力头部从语境中提取主题实体,并通过多层感知机回忆所需答案。作者提出了一种新的分析方法,可…

dll文件丢失怎么恢复,教你5种简单有效的方法

在计算机系统的运行过程中,动态链接库(DLL)文件扮演着至关重要的角色。它们作为共享函数库,封装了大量的可重用代码,使得多个应用程序能够高效调用并执行特定功能,极大地节省了系统资源,提升了软…

Arduino开发 esp32cam+opencv人脸识别距离+语音提醒

效果 低于20厘米语音提醒字体变红 QQ录屏20240406131651 Arduino代码 可直接复制使用&#xff08;修改自己的WIFI) #include <esp32cam.h> #include <WebServer.h> #include <WiFi.h> // 设置要连接的WiFi名称和密码 const char* WIFI_SSID "gumou&q…

指针的深入理解(六)

指针的深入理解&#xff08;六&#xff09; 个人主页&#xff1a;大白的编程日记 感谢遇见&#xff0c;我们一起学习进步&#xff01; 文章目录 指针的深入理解&#xff08;六&#xff09;前言一. sizeof和strlen1.1sizeof1.2strlen1.3sizeof和strlen对比 二.数组名和指针加减…

动态代理

动态代理 动态代理和静态代理角色一致。 代理类是动态生成的,不是我们直接写好的。 动态代理分为俩大类:基于接口的动态代理、基于类的动态代理 基于接口:JDK动态代理(以下示例就是这个) 基于类:cglib java字节码实现:javasist JDK动态代理 InvocationHandler Proxy …

C语言从入门到实战————编译和链接

目录 前言 1. 翻译环境和运行环境 2. 翻译环境 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.2.1 词法分析&#xff1a; 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运行环境 前言 编译和链接是将C语言源代码转换成可执行文件的必经过程&a…