1.史上最全面K近邻算法/KNN算法详解+python实现
2.高效相似度计算:局部敏感哈希算法Locality Sensitive Hashing (LSH)
3.深入浅出KNN算法(原理解析+代码实现)
4.ElasticSearch系列连载1. ES版本与开源简介
5.sklearn:Python语言开发的通用机器学习库
史上最全面K近邻算法/KNN算法详解+python实现
本文内容整理自贪心学院付费课程,课程网址:AI教AI。
本文github源代码网址:[此处应填写源代码网址]
本文目录:
1. KNN算法的核心思想
2. 用sklearn实现KNN代码讲解
3. KNN具体的实现步骤详解
4. 用python从零开始实现一个KNN算法
5. K近邻的决策边界以及决策边界的python可视化实现
6. 用交叉验证选择超参数K
7. 用特征缩放解决KNN算法的潜在隐患
8. KNN 算法总结
1. KNN算法的核心思想
KNN算法是一种简单有效的机器学习算法,主要用于分类问题,也适用于回归问题。KNN算法的volley的源码分析核心思想是:给定一个预测目标,计算预测目标和所有样本之间的距离或相似度,选择距离最近的前K个样本,通过这些样本来投票决策。
2. 用sklearn实现KNN代码讲解
使用sklearn库导入数据集,进行数据集分割,导入KNN模块,定义KNN对象,进行预测和计算准确率。
3. KNN具体的实现步骤详解
实现KNN算法需要具备四个方面的信息:特征工程、样本标注、相似度计算、选择最合适的K值。
4. 用python从零开始实现一个KNN算法
从零开始实现KNN算法,需要编写代码来计算距离、选择K值、进行投票决策等。
5. K近邻的决策边界以及决策边界的python可视化实现
决策边界的可视化实现可以通过改变K值来观察决策边界的变化。
6. 用交叉验证选择超参数K
使用交叉验证来选择K值,通过多次验证来确保结果的稳定性。
7. 用特征缩放解决KNN算法的潜在隐患
特征缩放可以解决KNN算法中特征值范围差异带来的问题。
8. KNN 算法总结
总结KNN算法的核心思想、实现步骤、潜在隐患和解决方法。
高效相似度计算:局部敏感哈希算法Locality Sensitive Hashing (LSH)
前言:最近工作接触文本相似度匹配的一些任务,对于使用的一些算法补下基础知识。
一、摘要
局部敏感哈希(LSH)是一种广泛应用于近似最近邻搜索(ANN)的技术。高效相似度搜索的解决方案是有利可图的,像谷歌、Netflix、jar源码转换亚马逊、Spotify、优步等大公司的许多核心功能都依赖于相似度搜索。例如亚马逊使用相似度搜索来比较用户,以相似度最高的用户,根据其历史购买记录来寻找新产品推荐。
二、背景
想象一个包含数百万甚至数十亿个样本的数据集,我们如何有效地比较所有这些样本?
即使在最好的硬件上,采用穷举法比较所有数据对是不可能的,这最多产生O(n²)的搜索复杂度。即使将单个查询与数十亿个样本进行比较,我们仍然产生最多为O(n)的搜索复杂度。此外还需要考虑单个相似性计算背后的复杂度。
怎样才能避免这种情况呢?
解决方案是近似搜索 ,不采用穷举搜索,而是 限制搜索范围,只搜索最相关的部分。
LSH是一种为我们提供亚线性搜索时间的算法。
三、算法简介
当我们考虑寻找相似向量对的复杂性时,我们发现即使在相当小的数据集上,比较所有东西所需的计算数量也是难以想象得大。这里引入 向量索引,如果我们想要将所有这些向量相互进行比较,最佳排序方法是对数线性时间复杂度。所以我们需要一种 减少比较次数 的方法。理想情况下,我们只想比较我们认为是潜在匹配的向量(候选对),局部敏感散(LSH)允许我们这样做。
LSH由多种不同的方法组成。在本文中,我们将介绍由多个步骤组成的传统方法——shingling、MinHashing和band的LSH函数。核心是顶尖源码下载允许对同一个样本进行分段和多次哈希,当一对向量至少被哈希到一次相同的值时,我们把它们标记为候选对(即潜在匹配的向量)。
典型的哈希函数旨在将不同的值放入不同的桶中,尽量减少多个键值被映射到同一个桶的可能性(即尽量减少哈希碰撞),LSH的哈希函数与其正好相反,希望将相似的值放入相同的桶中,实现最大化哈希碰撞(理想情况下只针对相似的输入,但不可避免地存在不相似的向量被标记为候选对进行minhash)。
在LSH中没有单一的哈希方法。事实上,它们都共享相同的“通过哈希函数的桶相似样本”逻辑,但它们可以有很大的不同。
四、三个步骤:Shingling, MinHashing, Band and LSH
本文探索LSH的方法包括三个步骤。首先,我们使用k-shingling(和one-hot编码)将文本转换为稀疏向量,然后使用minhashing创建“签名”,最后将签名向量传递给LSH环节以淘汰候选对。
4.1 k-Shingling
定义:k-Shingling(简称shingling)将一串文本转换为一组“shingles”的过程。这个过程类似于在我们的文本字符串中移动一个长度为k的窗口,并将每一步移动获取的k个字符 整理成去重的“shingle set”。
4.2 Minhashing
定义:在保持相相似度的情况下,Minhashing通过哈希函数将稀疏的one-hot编码向量映射到密集向量(minhash签名向量)。有了稀疏向量,我们所做的是为我们密集向量中的每个签名位置分配不同的minhash函数将稀疏向量映射到signature。
Min Hashing算法解决了前面所说的计算复杂度:它通过将向量A、B映射到低维空间中的两个签名向量,并且近似保持A、B之间的相似度,降低了用户相似度在高维下的计算复杂度。
4.3 Band 和 Hash
我们将对LSH采用banding方法——它将获取我们的签名,对每个签名的片段进行哈希,并查找哈希冲突,将具有一些相似性的签名哈希到同一桶中,从而将其标识为候选对。怎么粘贴源码
定义:banding方法通过将密集向量分成b个子向量,通过相同的哈希函数处理每个子向量并映射到一个哈希桶中,两个向量的子向量匹配,我们将各自的完整向量视为候选对。
例如,想象一下,我们把一个维的向量分成个片段,这给了我们次机会来识别两个向量之间匹配的子向量。但这也增加了误报的数量(我们标记为候选对的样本,它们实际并不相似),但是我们会尽量减少这些问题。
五、优化Bands
假设我们将signature向量分为[公式] 个band,每个band的大小为 [公式] ,两个用户向量之间的Jaccard相似度为 [公式] :
这个概率在[公式] 和 [公式] 取不同值时总是一个S形的曲线(这个S形曲线的特点在于,当 [公式] 超过一个阈值之后,两个用户成为candidate的概率会迅速增加并接近于1。这个阈值就是概率变化最陡的地方,近似为[公式] );
上面的例子中[公式] , [公式] ,可视化当前的概率值 [公式] -是否候选集 [公式] 之间的关系,我们注意到一个模式:虽然这种对齐并不完美,但我们可以看到理论计算的概率 [公式] 与真正的候选配对结果之间的相关性。
现在,我们可以通过修改[公式] 来推测具有不同相似性分数的候选对的返回概率,通过优化 [公式] 值来移动LSH函数的相似性阈值。
增加[公式] 值提供更多的子向量部分哈希碰撞的可能性更大,返回更多的候选对,将导致更多的误报(FP),也会减少一些漏网之鱼(FN).
六、源码
Github源码: github.com/topics/local...
Scala中基于Jaccard 距离的LSH相似度计算代码: spark.apache.org/docs/3...
七、参考
参考: Locality Sensitive Hashing (LSH): The Illustrated Guide | Pinecone
参考: hunter7z:大规模数据的相似度计算:LSH算法
参考: allen:一文纵览KNN(ANN)向量检索
深入浅出KNN算法(原理解析+代码实现)
KNN算法,即K最邻近算法,是一种基于“相似性”进行分类的简单方法。它通过比较样本间的photoshops源码解析“距离”来决定其类别归属,与K-means聚类算法有所区别,前者是监督学习,后者是无监督学习。KNN的核心思想是“物以类聚,人以群分”,即样本的分类取决于与其最邻近的K个已知样本的类别倾向。
衡量距离是KNN的关键,常用的距离度量包括欧氏距离、明可夫斯基距离、曼哈顿距离、切比雪夫距离和马氏距离。这些距离公式根据参数的不同,定义了不同类型的距离。KNN的决策过程是,新样本的类别由其与K个最邻近训练样本中类别分布最多的类别决定,但实际决策时,需要考虑距离的加权影响,即距离近的样本权重更大。
以下是一个简单的代码实现示例,假设我们有一个数据集(部分展示):
数据集(示例):
源码(简化版):
在这个代码片段中,会根据数据集中的距离计算出K个最近邻,然后根据加权原则确定新样本的类别。这段代码展示了KNN算法的具体应用过程。
ElasticSearch系列连载1. ES版本与开源简介
诞生背景
现有的技术在数据的结构化和存储方面已经做的很好了,但是在硬盘上的原始数据并不能充分发挥数据的价值,尤其是当你需要基于这些数据做一些实时的决策时,就更容易出现使用上的困难。
ES是一个 分布式,可扩展,实时 的搜索与数据分析引擎,能够有效解决在全文搜索 或者 结构化数据的实时分析问题。
不只是大型企业,如Wikipedia,Guardian,Stack Overflow,GitHub在使用。它也可以在你的笔记本上运行,或者扩展到几百台服务器,服务数PB的数据。
ES带来了革命,但是ES并没有使用或者创造革命性的技术:全文搜索,数据分析和分布式数据存储都是已经有的技术概念。 ES是通过将这三个独立的部分进行了巧妙地融合成了一个独立的、实时的应用程序,这才是ES带来的革命。
目前,大多数数据库在从数据中提取可操作的知识方面都出奇地无能。虽然他们可以通过时间戳进行筛选或者提取特定的字段,但是它们不能轻松的进行全文搜索,进行同义词搜索以及对数据进行相关性排序。
更重要的是,面对具有一定规模的数据,如果不对数据做大量的离线预处理、批处理,大多数数据库是无法提供实时服务的。
ES简介ES是在Apache Lucene之上开发的。
Apache Lucene是一个开源,先进,性能强劲,功能强大的搜索引擎。但它只是一个库,不仅需要使用Java代码才能使用,而且还需要理解Lucene内部逻辑和结构,整体用起来十分复杂。
虽然ES也是JAVA编写的,内部也是使用了Lucene来进行索引和搜索,但是通过十分科学的设计将Lucene的复杂性屏蔽在了ES强大且简单的RESTful API之后。
当然,ES不只是Lucene和全文搜索,它还是:
支持文档分布式存储的全字段实时搜索引擎
支持实时数据分析的分布式引擎
支持数百节点和PB级别的结构化与非结构化数据
同时,支持RESTful API,支持命令行,支持多种语言的SDK,使用Apache 2开源协议(已经经过多次调整)。
关于ES诞生的小故事:
在谈及当年接触 Lucene 并开发 Elasticsearch 的初衷的时候, Shay Banon 认为自己参与 Lucene 完全是一种偶然,当年他还是一个待业工程师,跟随自己的新婚妻子来到伦敦,妻子想在伦敦学习做一名厨师,而自己则想为妻子开发一个方便搜索菜谱的应用,所以才接触到 Lucene。直接使用 Lucene 构建搜索有很多问题,包含大量重复性的工作,所以 Shay Banon 便在 Lucene 的基础上不断地进行抽象,让 Java 程序嵌入搜索变得更容易,经过一段时间的打磨便诞生了他的第一个开源作品“Compass”,中文即“指南针”的意思。之后,他找到了一份面对高性能分布式开发环境的新工作,在工作中他渐渐发现越来越需要一个易用的、高性能、实时、分布式搜索服务,于是决定重写 Compass,将它从一个库打造成了一个独立的 server,并创建了开源项目。第一个公开版本出现在 年 2 月,在那之后 Elasticsearch 已经成为 Github 上最受欢迎的项目之一。关于ES的各个版本版本发布日期内容1.0.年2月日聚合分析、API、备份恢复等特性2.0.年月日存储压缩可配置、API语法升级等特性5.0.年月日使用Lucene 6.x、SDK、API升级、Text/Keyword、存储与性能大幅提升6.0.年月日排序、滚动升级、数据可靠、性能提升等特性7.0.年4月日使用Lucene 8.x、Security免费、Zen2、稳定性等特性8.0.年2月日Security默认启用、NLP支持、KNN、API升级、存储与性能提升ES开源协议历史开源背景Apache 2.0开源协议是最开放的协议之一:你可以修改源码将其整合到自己的产品中,并且选择不再继续开源。不像GPL等开源协议,它们会有禁止Copyleft的声明:如果使用了开源软件,你的软件也必须开源。
由于Apache 2.0协议的开放性,可能你自己开发的开源软件会被你的对手使用反过来和你进行竞争。
冲突产生这个事情就发生在了ES上,亚马逊于 年基于 Elasticsearch 推出自己的服务,将其称为 Amazon Elasticsearch Service。随后双方发生了激烈的争议。
协议变更在年1月,Elastic 在官网发文称将对Elasticsearch和Kibana在许可证方面进行了重大的更改,决定将 Elasticsearch 和 Kibana 的开源协议由 Apache 2.0 变更为 SSPL 与 Elastic License,主要原因为了阻止云厂商的「白嫖」。
之后,Amazon表示完全不能接受,ES随后发布了对应声明Amazon:完全不能接受 — 为什么我们必须变更 Elastic 许可协议
达成和解就在最近的年2月日,软件公司 Elastic 和亚马逊就一起商标侵权诉讼达成了和解。亚马逊开始从网站的各个页面以及其服务和相关项目名称中删除“Elasticsearch”一词,并由 Elastic 销售的 Elastic Cloud 取而代之。这是 Elastic 的一次重大胜利,该公司曾多次与亚马逊发生冲突。
“现在 AWS 和 AWS Marketplace 上唯一的 Elasticsearch 服务是 Elastic Cloud,我们认为这是消除市场混乱的重要一步。只有一个 Elasticsearch,而且它只来自 Elastic。”Elastic 创始人兼首席技术官 Shay Banon 说。亚马逊之前还将 Amazon Elasticsearch Service 重命名为 Amazon OpenSearch Service。从现在开始,如果你在 AWS、Azure、Google Cloud 中看到“Elasticsearch”,就会知道它肯定来自 Elastic。
ES开源状态总结从Elastic 7.版本开始,Elastic 将把 Apache 2.0 授权的 Elasticsearch 和 Kibana代码转为SSPL和Elastic License的双重授权,让用户可以选择使用哪个授权。SSPL是MongoDB创建的一个源码可用的许可证,以体现开源的原则,同时提供保护,防止公有云提供商将开源产品作为服务提供而不回馈。SSPL允许自由和不受限制的使用和修改,但如果你把产品作为服务提供给别人,你也必须在SSPL下公开发布任何修改以及管理层的源代码。
关注持续更新:下一节 - ElasticSearch系列连载2. 如何本地安装与调试ES
原文:/post/sklearn:Python语言开发的通用机器学习库
sklearn,Python中的强大机器学习工具,对于实际项目应用,即便基础理论不足,也能通过API直接操作。它不仅是算法库的典范,其详尽文档如同《金刚经》般指导学习者入门。
sklearn库的核心价值在于其广泛且完善的算法覆盖,以及易懂的文档设计。掌握基本的机器学习理论,结合sklearn提供的基础概念,如training data和model selection,就能有效利用其功能。它主要分为六个模块:分类、回归、聚类、降维、模型选择和预处理。
实现机器学习项目通常分三步:数据预处理、模型构建与预测以及模型评估。以Iris数据集为例,通过数据划分、kNN分类,我们能快速上手sklearn的API。模型评估则涉及精确率、召回率等指标,确保模型效果。
虽然深入理解sklearn需要一定的理论基础,但实际应用中,调用API而非底层实现更为常见。学习sklearn,可以分为三个层次:调用、调参和嚼透。初期只需掌握基本调用,随着经验积累,再逐步深入理解算法细节和调优。
总结来说,sklearn是一个实用且强大的工具,适合初学者快速入门机器学习。在实际应用中,利用现有的库和理解源码是更明智的选择。而对于更深层次的理解,可以参考《全栈数据之门》或其他相关书籍。