当前位置: 首页 > news >正文

Spark2.x 入门: KMeans 聚类算法

一 KMeans简介

KMeans 是一个迭代求解的聚类算法,其属于 划分(Partitioning) 型的聚类方法,即首先创建K个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量。

ML包下的KMeans方法位于org.apache.spark.ml.clustering包下,其过程大致如下:

1.根据给定的k值,选取k个样本点作为初始划分中心;
2.计算所有样本点到每一个划分中心的距离,并将所有样本点划分到距离最近的划分中心;
3.计算每个划分中样本点的平均值,将其作为新的中心;
循环进行2~3步直至达到最大迭代次数,或划分中心的变化小于某一预定义阈值

显然,初始划分中心的选取在很大程度上决定了最终聚类的质量,和MLlib包一样,ML包内置的KMeans类也提供了名为 KMeans|| 的初始划分中心选择方法,它是著名的 KMeans++ 方法的并行化版本,其思想是令初始聚类中心尽可能的互相远离,具体实现细节可以参见斯坦福大学的B Bahmani在PVLDB上的论文Scalable K-Means++,这里不再赘述。

二 实战

与MLlib版本的Kmeans教程相同,本文亦使用UCI数据集中的鸢尾花数据Iris进行实验,它可以在iris获取,Iris数据的样本容量为150,有四个实数值的特征,分别代表花朵四个部位的尺寸,以及该样本对应鸢尾花的亚种类型(共有3种亚种类型),如下所示:

5.1,3.5,1.4,0.2,setosa
...
5.4,3.0,4.5,1.5,versicolor
...
7.1,3.0,5.9,2.1,virginica
...

在使用前,引入需要的包:

import org.apache.spark.ml.clustering.{KMeans,KMeansModel}
import org.apache.spark.ml.linalg.{Vector,Vectors}

开启RDD的隐式转换:

import spark.implicits._

下文中,我们默认名为sparkSparkSession已经创建。

为了便于生成相应的DataFrame,这里定义一个名为model_instancecase class作为DataFrame每一行(一个数据样本)的数据类型。
注:因为是非监督学习,所以不需要数据中的label,只需要使用特征向量数据就可以。

scala> case class model_instance(features: org.apache.spark.ml.linalg.Vector)
defined class model_instance

在定义数据类型完成后,即可将数据读入RDD[model_instance]的结构中,并通过RDD的隐式转换.toDF()方法完成RDDDataFrame的转换:

val rawData = sc.textFile("file:///root/data/iris.txt")
rawData: org.apache.spark.rdd.RDD[String] = file:///root/data/iris.txt MapPartitionsRDD[220] at textFile at <console>:56scala> val df = rawData.map(line =>{ model_instance( Vectors.dense(line.split(",").filter(p => p.matches("\\d*(\\.?)\\d*")).map(_.toDouble)) )}).toDF()
df: org.apache.spark.sql.DataFrame = [features: vector]

MLlib版的教程类似,我们使用了filter算子,过滤掉类标签,正则表达式\\d*(\\.?)\\d*可以用于匹配实数类型的数字,\\d*使用了*限定符,表示匹配0次或多次的数字字符,\\.?使用了?限定符,表示匹配0次或1次的小数点。

在得到数据后,我们即可通过ML包的固有流程:创建Estimator并调用其fit()方法来生成相应的Transformer对象,很显然,在这里KMeans类是Estimator,而用于保存训练后模型的KMeansModel类则属于Transformer

scala> val kmeansmodel = new KMeans().setK(3).setFeaturesCol("features").setPredictionCol("prediction").fit(df)
kmeansmodel: org.apache.spark.ml.clustering.KMeansModel = kmeans_bdadcf53b52e

MLlib版本类似,ML包下的KMeans方法也有Seed(随机数种子)、Tol(收敛阈值)、K(簇个数)、MaxIter(最大迭代次数)、initMode(初始化方式)、initStep(KMeans||方法的步数)等参数可供设置,和其他的ML框架算法一样,用户可以通过相应的setXXX()方法来进行设置,或以ParamMap的形式传入参数,这里为了简介期间,使用setXXX()方法设置了参数K,其余参数均采用默认值

与MLlib中的实现不同,KMeansModel作为一个Transformer,不再提供predict()样式的方法,而是提供了一致性的transform()方法,用于将存储在DataFrame中的给定数据集进行整体处理,生成带有预测簇标签的数据集:

scala> val results = kmeansmodel.transform(df)
results: org.apache.spark.sql.DataFrame = [features: vector, prediction: int]

为了方便观察,我们可以使用collect()方法,该方法将DataFrame中所有的数据组织成一个Array对象进行返回:

scala> results.collect().foreach(row => {println( row(0) + " is predicted as cluster " + row(1))})
[5.1,3.5,1.4,0.2] is predicted as cluster 2
...
[6.3,3.3,6.0,2.5] is predicted as cluster 1
...
[5.8,2.7,5.1,1.9] is predicted as cluster 0
...scala> results.show()
+-----------------+----------+
|         features|prediction|
+-----------------+----------+
|[5.1,3.5,1.4,0.2]|         0|
|[4.9,3.0,1.4,0.2]|         0|
|[4.7,3.2,1.3,0.2]|         0|
|[4.6,3.1,1.5,0.2]|         0|
|[5.0,3.6,1.4,0.2]|         0|
|[5.4,3.9,1.7,0.4]|         0|
|[4.6,3.4,1.4,0.3]|         0|
|[5.0,3.4,1.5,0.2]|         0|
|[4.4,2.9,1.4,0.2]|         0|
|[4.9,3.1,1.5,0.1]|         0|
|[5.4,3.7,1.5,0.2]|         0|
|[4.8,3.4,1.6,0.2]|         0|
|[4.8,3.0,1.4,0.1]|         0|
|[4.3,3.0,1.1,0.1]|         0|
|[5.8,4.0,1.2,0.2]|         0|
|[5.7,4.4,1.5,0.4]|         0|
|[5.4,3.9,1.3,0.4]|         0|
|[5.1,3.5,1.4,0.3]|         0|
|[5.7,3.8,1.7,0.3]|         0|
|[5.1,3.8,1.5,0.3]|         0|
+-----------------+----------+
only showing top 20 rows

也可以通过KMeansModel类自带的clusterCenters属性获取到模型的所有聚类中心情况:

scala> kmeansmodel.clusterCenters.foreach(center => {println("Clustering Center:"+center)})
Clustering Center:[5.005999999999999,3.4180000000000006,1.4640000000000002,0.2439999999999999]
Clustering Center:[5.901612903225806,2.7483870967741932,4.393548387096774,1.433870967741935]
Clustering Center:[6.85,3.0736842105263147,5.742105263157893,2.071052631578947]

与MLlib下的实现相同,KMeansModel类也提供了计算 集合内误差平方和(Within Set Sum of Squared Error, WSSSE) 的方法来度量聚类的有效性,在真实K值未知的情况下,该值的变化可以作为选取合适K值的一个重要参考:

scala> kmeansmodel.computeCost(df)
res30: Double = 78.94084142614622

相关文章:

Spark2.x 入门: KMeans 聚类算法

一 KMeans简介 KMeans 是一个迭代求解的聚类算法&#xff0c;其属于 划分&#xff08;Partitioning&#xff09; 型的聚类方法&#xff0c;即首先创建K个划分&#xff0c;然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量。 ML包下的KMeans方法位于org.apach…...

如何快速练习键盘盲打

盲打是指在不看键盘的情况下进行打字&#xff0c;这样可以显著提高打字速度和效率。以下是一些练习盲打的方法&#xff1a; 熟悉键盘布局&#xff1a;首先&#xff0c;你需要熟悉键盘上的字母和符号的位置。可以通过键盘图或者键盘贴纸来帮助记忆。 使用在线打字练习工具&…...

Flask中实现WebSocket需要什么组件

在Flask中实现WebSocket功能&#xff0c;通常不会直接使用Flask本身&#xff0c;因为Flask是一个轻量级的Web框架&#xff0c;主要设计用于处理HTTP请求。然而&#xff0c;你可以通过集成一些第三方库来在Flask应用中支持WebSocket。WebSocket是一种在单个TCP连接上进行全双工通…...

java8 Stream流详解

前言 Java 8引入了一种新的处理集合的方式——Stream API。它提供了一种高级迭代方式&#xff0c;支持函数式编程风格&#xff0c;使得集合操作更加简洁、清晰。本文将详细介绍Java 8 Stream API的核心概念、操作和使用技巧。 Stream API 简介 Stream API是Java 8中的一大亮…...

通信工程学习:什么是AB地址总线、DB数据总线、CD控制总线

AB地址总线、DB数据总线、CD控制总线 在计算机体系结构中&#xff0c;总线&#xff08;Bus&#xff09;是一种用于在计算机内部各个组件之间传输信息的物理通道。其中&#xff0c;AB地址总线、DB数据总线和CD控制总线是计算机总线系统中非常重要的三个组成部分&#xff0c;它们…...

CP AUTOSAR标准之EthernetInterface(AUTOSAR_SWS_EthernetInterface)(更新中……)

1 简介和功能概述 该规范指定了AUTOSAR基础软件模块以太网接口的功能、API和配置。   在AUTOSAR分层软件架构[1]中,以太网接口属于ECU抽象层,或者更准确地说,属于通信硬件抽象。   这表明了以太网接口的主要任务:   为上层提供独立于硬件的以太网通信系统接口,该系统…...

Windows系统离线安装使用pm2 管理进程

目录 1. 安装 Node.js 和 npm 2. 创建一个项目目录 3. 初始化 npm 项目 4. 下载 pm2 及其所有依赖 5. 打包 pm2 及其依赖 6. 将打包文件传输到内网服务器 7. 在内网服务器上解压并安装 8. 使用 pm2 总结 在联网的机器上&#xff0c;使用 npm&#xff08;Node.js 包管理…...

4-4.Andorid Camera 之简化编码模板(获取摄像头 ID、选择最优预览尺寸)

一、Camera 简化思路 在 Camera 的开发中&#xff0c;其实我们通常只关注打开相机、图像预览和关闭相机&#xff0c;其他的步骤我们不应该花费太多的精力 为此&#xff0c;应该提供一个工具类&#xff0c;它有处理相机的一些基本工具方法&#xff0c;包括获取摄像头 ID、选择最…...

【深度学习】向量化

1. 什么是向量化 向量化通常是消除代码中显示for循环语句的技巧&#xff0c;在深度学习实际应用中&#xff0c;可能会遇到大量的训练数据&#xff0c;因为深度学习算法往往在这种情况下表现更好&#xff0c;所以代码的运行速度非常重要&#xff0c;否则如果它运行在一个大的数据…...

基于canal的Redis缓存双写

canal地址&#xff1a;alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)https://github.com/alibaba/canal 1. 准备 1.1 MySQL 查看主机二进制日志 show master status 查看binlog是否开启 show variables like log_bin 授权canal连接MySQL账号 …...

以太网交换机工作原理学习笔记

在网络中传输数据时需要遵循一些标准&#xff0c;以太网协议定义了数据帧在以太网上的传输标准&#xff0c;了解以太网协议是充分理解数据链路层通信的基础。以太网交换机是实现数据链路层通信的主要设备&#xff0c;了解以太网交换机的工作原理也是十分必要的。 1、以太网协议…...

ECCV`24 | 蚂蚁集团开源风格控制新SOTA!StyleTokenizer:零样本精确控制图像生成

文章链接&#xff1a;https://arxiv.org/pdf/2409.02543 代码&数据集链接&#xff1a; https://github.com/alipay/style-tokenizer 亮点直击 介绍了一种名为StyleTokenizer的新方法&#xff0c;用于在扩散模型中进行风格控制。这种方法允许通过一个任意参考图像实现对生成…...

Flutter的升级和降级步骤

升级 1.版本升级 // 升级到指定版本 flutter upgrade 版本号 // 升级到最新版本 flutter upgrade 2. 更新开发配置 启动 Android Studio。 打开 Settings 对话框&#xff0c;查看 SDK Manager。 如果你已经打开了一个项目&#xff0c;请打开 Tools > SDK Manager。 如果…...

计算机网络与Internet应用

一、计算机网络 1.计算机网络的定义 网络定义&#xff1a;计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享…...

[建模已更新]2024数学建模国赛高教社杯A题:“板凳龙” 闹元宵 思路代码文章助攻手把手保姆级

本系列专栏将包括两大块内容 第一块赛前真题和模型教学,包括至少8次真题实战教学,每期教学专栏的最底部会提供完整的资料百度网盘包括:真题、数据、可复现代码以及文章. 第二块包括赛中详细思路建模、代码的参考助攻, 会提供2024年高教社国赛A的全套参考内容(一般36h内更新完毕…...

Spring Boot-自定义banner

在 Spring Boot 应用中&#xff0c;你可以自定义启动时显示的 banner。这些 banner 可以包括图形、文字或者其他形式的标识。如图所示&#xff1a; 1. 使用 banner.txt 文件 默认情况下&#xff0c;Spring Boot 使用项目的 banner.txt 文件中的内容作为启动时的 banner。你可以…...

2158. 直播获奖(live)

代码 #include<bits/stdc.h> using namespace std; int main() {int n,w,a[100000],cnt[601]{0},i,j,s;cin>>n>>w;for(i0;i<n;i){scanf("%d",&a[i]);cnt[a[i]];int x(i1)*w/100;if(!x) x1;for(j600,s0;j>0;j--){scnt[j];if(s>x){cou…...

python---爬取QQ音乐

如Cookie为非vip&#xff0c;仅能获取非vip歌曲 1.下载包 pip install jsonpath 2.代码 import os import time import requests from jsonpath import jsonpathdef search_and_download_qq_music(query_text):headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; …...

tomato靶场攻略

1.使用nmap扫描同网段的端口&#xff0c;发现靶机地址 2.访问到主页面&#xff0c;只能看到一个大西红柿 3.再来使用dirb扫面以下有那些目录&#xff0c;发现有一个antibot_image 4.访问我们扫到的地址 &#xff0c;点金目录里看看有些什么文件 5.看到info.php很熟悉&#xff0…...

Django+Vue3前后端分离学习(一)(项目开始时settings.py里的设置)

一、创建django项目 二、修改settings.py里的配置&#xff1a; 1、修改语言和时区&#xff1a; # 语言编码 LANGUAGE_CODE zh-hansTIME_ZONE UTCUSE_I18N True# 不用时区 USE_TZ False 2、配置数据库&#xff1a; DATABASES {default: {ENGINE: django.db.backends.m…...

OpenClaw技能市场巡礼:Top5适合Phi-3-vision-128k-instruct的图文处理插件

OpenClaw技能市场巡礼&#xff1a;Top5适合Phi-3-vision-128k-instruct的图文处理插件 1. 为什么需要为多模态模型搭配专用技能&#xff1f; 去年我在尝试用OpenClaw处理一批产品截图时&#xff0c;发现一个有趣现象&#xff1a;当我把图片直接丢给普通文本模型时&#xff0c…...

NAssistant上位机实战:从TOFSense数据解析到固件升级全流程

1. NAssistant上位机初识&#xff1a;连接TOFSense的起点 第一次打开NAssistant上位机时&#xff0c;那个简洁的灰色界面可能会让你觉得无从下手。别担心&#xff0c;我刚开始用的时候也是这样。这个由Nooploop开发的工具其实设计得非常直观&#xff0c;只是需要一点时间来熟悉…...

基于WPS云服务架构的Vue文档预览组件技术实现与性能优化

基于WPS云服务架构的Vue文档预览组件技术实现与性能优化 【免费下载链接】wps-view-vue wps在线编辑、预览前端vue项目&#xff0c;基于es6 项目地址: https://gitcode.com/gh_mirrors/wp/wps-view-vue 在微前端架构和云原生应用日益普及的技术背景下&#xff0c;企业级…...

MCP 实现深度技术报告

1. MCP 协议概述与架构定位 1.1 协议背景 Model Context Protocol (MCP) 是 Anthropic 推出的开放标准协议&#xff0c;旨在标准化 AI 助手与外部数据源、工具之间的集成方式。在 Claude Code 中&#xff0c;MCP 不仅是外部集成接口&#xff0c;更是核心架构组件&#xff0c;…...

Gemma-3-12B-IT WebUI保姆级教程:含Supervisord进程守护与开机自启

Gemma-3-12B-IT WebUI保姆级教程&#xff1a;含Supervisord进程守护与开机自启 1. 前言&#xff1a;为什么选择Gemma-3-12B-IT&#xff1f; 如果你正在寻找一个性能强劲、部署友好&#xff0c;而且完全免费开源的大语言模型&#xff0c;那么Google的Gemma-3-12B-IT绝对值得你…...

手把手教你用Transceiver Wizard搞定UltraScale FPGA的GTY时钟网络规划

手把手教你用Transceiver Wizard搞定UltraScale FPGA的GTY时钟网络规划 在FPGA高速收发器设计中&#xff0c;时钟网络的合理规划往往是决定系统稳定性的关键因素。对于刚接触Xilinx UltraScale架构的开发者来说&#xff0c;GTY收发器的时钟分配规则就像一座迷宫——相邻Bank共享…...

STM32压力传感器统一驱动:BMP280/MS5803/ADS1115/SDP3x

目录 一、4 款传感器 典型应用场景 二、统一软件工程接口&#xff08;标准 C 语言&#xff0c;可直接用&#xff09; 1. 通用结构体&#xff08;所有传感器统一格式&#xff09; 三、4 款传感器 完整驱动 校准接口 1. BMP280 气压 / 温度 应用&#xff1a;环境气压、高度…...

OpenClaw技能扩展实战:安装Phi-3-vision-128k-instruct专用图文处理模块

OpenClaw技能扩展实战&#xff1a;安装Phi-3-vision-128k-instruct专用图文处理模块 1. 为什么需要专用技能模块&#xff1f; 上周我在整理技术文档时遇到一个典型场景&#xff1a;需要将十几份混杂着截图和文字说明的会议纪要&#xff0c;自动转换成结构化的Markdown文件。当…...

JSW-8016GM4 加固交换机

■ 三层交换机&#xff0c;功能强大 ■ 支持16个10/100/1000M 以太网接口 ■ 支持4个10G光纤接口 ■ 支持IEEE802相关协议 ■ 2U高度&#xff0c;可在方舱上架安装 ■ 满足电磁兼容要求 ■ 整机加固设计&#xff0c;满足国军标相关要求主要参数产品类型&#xff1a;千兆以太网交…...

AG-UI协议实战:构建智能体驱动的动态前端交互系统

1. AG-UI协议&#xff1a;智能体与前端交互的新范式 第一次听说AG-UI协议时&#xff0c;我正在为一个电商项目头疼——后台AI生成的商品推荐总需要手动同步到前端&#xff0c;代码里到处是setState和事件监听。直到发现这个协议&#xff0c;才明白原来智能体和前端可以像两个老…...