SKIL/工作流程/KNN(K邻近值算法)

2023-10-21 16:50

本文主要是介绍SKIL/工作流程/KNN(K邻近值算法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

K邻近值算法

除了部署转换和网络模型,SKIL还允许你部署KNN模型。

KNN (k邻近值算法) 是最简单的分类算法之一,广泛用于解决机器学习的基本问题。通过计算输入数据和数据集中所有示例之间的相似度(或距离)函数,找出最接近给定数据点的示例。knn中的“k”表示算法在对数据执行时,我们希望获得的最接近的示例的“k”个分类数。

 

K邻近值算法流程

该工作流程涉及到生成一个二进制KNN向量文件,其中包含将在其上执行K邻近值算法的数据集。向量文件将包含行向量,表示数据集中的每个示例。有一个可选的标签文件,其中包含表示数据集中每个示例行数据向量的标签。如果没有提供,则在查询模型时,数据集中行向量的索引将作为标签返回,或者在标签字段中返回“None”字符串。

这些步骤可以概括为:

  1. 收集要表示为数据集的数据,其中每个示例都以行向量形式表示。
  2. 创建一个标签文件,表示数据集中每个数据点的标签。
  3. 使用BinarySerde和INDArray以二进制形式保存数据集。
  4. 保存标签文件,其中每一行包含数据集中每个数据点的标签,每个数据点位于不同的行中。
  5. 部署时导入KNN模型和标签文件。
  6. 查询KNN模型。

下面的示例将演示所有这些步骤。

 

示例

 

0. 载加依赖

 

本演示使用SMILE库计算任何k-means 数据的质心。要使用SMILE库,请在笔记本中加载以下依赖项。

 

%spark.depz.load("com.github.haifengl:smile-core:jar:1.5.1")

 

1. 创建数据集

 

在这里,对于每个示例,KNN数据集中的数据点被展平为它们的行向量形式。演示使用k-means将12个数据点聚类为3个质心。

import smile.clustering.GMeans
import smile.clustering.KMeansimport io.skymind.zeppelin.utils._
import org.nd4j.linalg.factory.Nd4jval kmeanData = Array(Array(-1.0, -1.2, -1.1), Array(-1.1, -1.1, -1.0), Array(-0.9, -0.9, -1.2), Array(-0.9, -1.0, -0.9), Array(0.0, 0.0, 0.0), Array(0.1, 0.2, 0.3), Array(-0.1, 0.2, -0.1), Array(0.1, 0.1, 0.1), Array(1.0, 1.0, 1.0),Array(1.1, 1.1, 1.1),Array(1.0, 0.9, 0.9),Array(1.2, 0.9, 1.0)
)val kmeans = new KMeans(kmeanData, 3)kmeans.predict(Array(-1.0, 0.0, 0.0))val centers = kmeans.centroids()val array = Nd4j.create(centers)

array变量包含3个质心,将用作KNN数据集。

 

2. 创建标签

这里的标签非常简单,每一行都被标记为其索引。实际上,这些标签可以是任何字符串值。

 

val labels = centers.indices

 

3. 保存数据集

要将INDArrays序列化为二进制形式,请确保使用 BinarySerde#writeArrayToDisk。

import java.io.File
import org.nd4j.serde.binary.BinarySerdeBinarySerde.writeArrayToDisk(array, new File("/tmp/centroids.bin"))

 

4. 保存标签

 

标签可以正常保存,每行代表数据集中每行数据向量的标签字符串。

import java.io.PrintWriterval writer = new PrintWriter(new File("/tmp/centroids.labels"))for (i <- labels) {writer.println(i.toString)
}
writer.close()

 

5. 导入KNN

可以像在SKIL用户界面中导入其他部署模型一样导入KNN模型。

Import a model

导入模型
在笔记本示例中,模型保存在/tmp/centroids.bin,标签保存在/tmp/centroids.labels。请记住,标签文件是可选的。
当你想知道从输入数据点到数据点的最远距离时,“inverted”复选框很有用。当你想在数据集中查找离群点时,这很有用。


“相似性函数”选择列表指定了在计算给定数据点与数据集中其余示例之间的相似性/距离时要使用的距离函数。


填写完表格后,如下图所示,单击“导入KNN(Import KNN)”。

Filling KNN import details

填写KNN导入明细


模型导入成功后,启动KNN服务器。

Starting KNN server

启动KNN服务器

在状态指示服务器已启动后,可以查询KNN服务器。同时复制使用“endpoint”头的端点URL。这里是http://localhost:9008/endpoints/demo/knn/knntest/default/。这可能会因填写在KNN导入模型表单中的表单设置而有所不同。

KNN server started

KNN 服务器启动

 

6. 查询KNN模型

要查询KNN模型,可以使用以下端点:

  • https://docs.skymind.ai/v1.1/reference#knn
  • https://docs.skymind.ai/v1.1/reference#knnnew
// 部署完之后:
import com.mashape.unirest.http.Unirest
import org.json.JSONObjectimport java.text.MessageFormatimport org.nd4j.linalg.factory.Nd4j
import org.nd4j.serde.base64.Nd4jBase64val skilContext = new SkilContext()Unirest.setDefaultHeader("Authorization", "Token " + skilContext.client.getAuthToken);//Ref: https://docs.skymind.ai/v1.1/reference#knn
val nearestNeighborResultsKnn = Unirest.post(MessageFormat.format("http://localhost:9008/endpoints/demo/knn/knntest/default/{0}", "knn")).header("accept", "application/json").header("Content-Type", "application/json").body(new JSONObject() //使用它是因为字段函数无法转换为可接受的JSON.put("k", 2).put("index", 1).toString()).asJson().getBody().getObject()val base64Array = Nd4jBase64.base64String(Nd4j.create(Array(0.0, 0.0, 0.0))); // Base64 Encoded form of Array - [0.0, 0.0, 0.0]// Ref: https://docs.skymind.ai/v1.1/reference#knnnew
val nearestNeighborResultsKnnNew = Unirest.post(MessageFormat.format("http://localhost:9008/endpoints/demo/knn/knntest/default/{0}", "knnnew")).header("accept", "application/json").header("Content-Type", "application/json").body(new JSONObject() //使用它是因为字段函数无法转换为可接受的JSON.put("k", 2).put("index", 1).put("ndarray", base64Array).toString()).asJson().getBody().getObject()

这篇关于SKIL/工作流程/KNN(K邻近值算法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/255668

相关文章

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

SpringBoot集成XXL-JOB实现任务管理全流程

《SpringBoot集成XXL-JOB实现任务管理全流程》XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展,本文介绍如何通过SpringBoot项目,使用RestTempl... 目录一、前言二、项目结构简述三、Maven 依赖四、Controller 代码详解五、Service

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 升级到8.4版本的完整流程及操作方法

《MySQL升级到8.4版本的完整流程及操作方法》本文详细说明了MySQL升级至8.4的完整流程,涵盖升级前准备(备份、兼容性检查)、支持路径(原地、逻辑导出、复制)、关键变更(空间索引、保留关键字... 目录一、升级前准备 (3.1 Before You Begin)二、升级路径 (3.2 Upgrade

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Spring Boot从main方法到内嵌Tomcat的全过程(自动化流程)

《SpringBoot从main方法到内嵌Tomcat的全过程(自动化流程)》SpringBoot启动始于main方法,创建SpringApplication实例,初始化上下文,准备环境,刷新容器并... 目录1. 入口:main方法2. SpringApplication初始化2.1 构造阶段3. 运行阶

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程