一篇文章入门KNN算法

文章目录

  • KNN
    • KNN算法
    • KNN in practice
    • 推荐系统
      • 我们想回答什么问题?
      • 探索、清理和准备数据
      • 使用算法
    • Summary
  • 参考文献

KNN

监督学习是一种依赖输入数据来学习函数的算法,该函数在给定新的未标记数据时可以产生适当的输出

监督学习用于解决分类或回归问题。

分类问题的输出是离散值。例如,“喜欢披萨上的菠萝”和“不喜欢披萨上菠萝”是离散的,没有中间立场。

回归问题的输出是实数(带小数点的数字)。例如,我们可以使用下表中的数据来估计给定身高的人的体重。

在这里插入图片描述
我们有一个自变量(或一组自变量)和一个因变量(给定自变量,我们试图猜测的事情)。例如,我们可以说身高是自变量,体重是因变量。

无监督的机器学习算法使用没有任何标签的输入数据——换句话说,没有老师(标签)告诉孩子(计算机)什么时候是正确的,什么时候犯了错误

监督学习试图学习一个函数,该函数将允许我们在给定一些新的未标记数据的情况下进行预测;无监督学习试图学习数据的基本结构,让我们对数据有更多的了解。

KNN算法

KNN算法假设相似的事物存在于非常接近的地方,换句话说,相似的事物彼此接近

“Birds of a feather flock together.”

在这里插入图片描述
在上图中,大多数情况下,相似的数据点彼此接近。KNN算法取决于这个假设是否足够真实,从而使算法有用。

**直线距离(Euclidean Distance)**是一个流行且熟悉的选择。

The KNN Algorithm:

  1. Load the data
  2. Initialize K to your chosen number of neighbors
  3. For each example in the data: Calculate the distance between the query example and the current example from the data; Add the distance and the index of the example to an ordered collection.
  4. Sort the ordered collection of distances and indices from smallest to largest (in ascending order) by the distances.
  5. Pick the first K entries from the sorted collection.
  6. Get the labels of the selected K entries.
  7. If regression, return the mean of the K labels.
  8. If classification, return the mode of the K labels.
# --*-- coding:utf-8 --*--
# @Author : 一只楚楚猫
# @File : 03KNN.py
# @Software : PyCharm
from collections import Counter
import mathdef knn(data, query, k, distance_fn, choice_fn):""":param data: Regression Data:param query: Query Data:param k: K Neighbours:param distance_fn: Euclidean Distance:param choice_fn::return:"""neighbor_distances_and_indices = []# 3. For each example in the datafor index, example in enumerate(data):# 3.1 Calculate the distance between the query example and the current# example from the data.distance = distance_fn(example[:-1], query)# 3.2 Add the distance and the index of the example to an ordered collectionneighbor_distances_and_indices.append((distance, index))# 4. Sort the ordered collection of distances and indices from# smallest to largest (in ascending order) by the distancessorted_neighbor_distances_and_indices = sorted(neighbor_distances_and_indices)# 5. Pick the first K entries from the sorted collectionk_nearest_distances_and_indices = sorted_neighbor_distances_and_indices[:k]# 6. Get the labels of the selected K entriesk_nearest_labels = [data[i][-1] for distance, i in k_nearest_distances_and_indices]# 7. If regression (choice_fn = mean), return the average of the K labels# 8. If classification (choice_fn = mode), return the mode of the K labelsreturn k_nearest_distances_and_indices, choice_fn(k_nearest_labels)def mean(labels):return sum(labels) / len(labels)def mode(labels):"""most_common是Counter类的方法,用于返回出现频率最高的元素及其计数。在这里,most_common(1)返回一个包含一个元组的列表,元组的第一个元素是出现频率最高的元素,第二个元素是该元素出现的次数。由于我们指定参数1,因此它返回出现频率最高的1个元素。"""return Counter(labels).most_common(1)[0][0]def euclidean_distance(point1, point2):sum_squared_distance = 0for i in range(len(point1)):sum_squared_distance += math.pow(point1[i] - point2[i], 2)return math.sqrt(sum_squared_distance)def main():'''# Regression Data## Column 0: height (inches)# Column 1: weight (pounds)'''reg_data = [[65.75, 112.99],[71.52, 136.49],[69.40, 153.03],[68.22, 142.34],[67.79, 144.30],[68.70, 123.30],[69.80, 141.49],[70.01, 136.46],[67.90, 112.37],[66.49, 127.45],]# Question:# Given the data we have, what's the best-guess at someone's weight if they are 60 inches tall?reg_query = [60]reg_k_nearest_neighbors, reg_prediction = knn(reg_data, reg_query, k=3, distance_fn=euclidean_distance, choice_fn=mean)print(f"reg_prediction: {reg_prediction}")'''# Classification Data# # Column 0: age# Column 1: likes pineapple'''clf_data = [[22, 1],[23, 1],[21, 1],[18, 1],[19, 1],[25, 0],[27, 0],[29, 0],[31, 0],[45, 0],]# Question:# Given the data we have, does a 33 year old like pineapples on their pizza?clf_query = [33]clf_k_nearest_neighbors, clf_prediction = knn(clf_data, clf_query, k=3, distance_fn=euclidean_distance, choice_fn=mode)print(f"cls_prediction: {clf_prediction}")if __name__ == '__main__':main()

Advantages:

  1. 该算法简单,易于实现。
  2. 无需构建模型、调整多个参数或做出额外的假设。
  3. 该算法具有通用性。它可用于分类、回归和搜索。

Disadvantages:

  1. 随着自变量的增加,算法会明显变慢

KNN in practice

KNN 的主要缺点是随着数据量的增加而明显变慢,这使得它在需要快速做出预测的环境中成为不切实际的选择。

在推荐系统中可以使用KNN算法

推荐系统

我们想回答什么问题?

给定我们的电影数据集,与电影查询最相似的 5 部电影是什么?

探索、清理和准备数据

我们上面的 KNN 实现依赖于结构化数据。它需要采用表格格式。此外,该实现假设所有列都包含数字数据,并且数据的最后一列具有可以执行某些功能的标签。因此,无论我们从哪里获取数据,我们都需要使其符合这些约束。

该数据包含 30 部电影,包括七种类型的每部电影的数据及其 IMDB 评级。标签列全为零,因为我们不使用该数据集进行分类或回归。

此外,在使用 KNN 算法时,电影之间的关系(例如演员、导演和主题)不会被考虑在内,因为捕获这些关系的数据在数据集中丢失了。因此,当我们对数据运行 KNN 算法时,相似性将仅基于所包含的类型和电影的 IMDB 评级。

使用算法

想象一下。我们正在浏览 MoviesXb 网站(一个虚构的 IMDb 衍生产品),然后遇到了《华盛顿邮报》。我们不确定我们是否想看它,但它的类型引起了我们的兴趣;我们对其他类似的电影感到好奇。我们向下滚动到 “更多类似内容” 部分,看看 MoviesXb 会提出什么建议,算法齿轮开始转动。

MoviesXb 网站向其后端发送请求,获取与《华盛顿邮报》最相似的 5 部电影。后端有一个和我们一模一样的推荐数据集。它首先为《华盛顿邮报》创建行表示(更广为人知的名称是特征向量),然后运行类似于下面的程序来搜索与《华盛顿邮报》最相似的 5 部电影,最后将结果发送回 MoviesXb 网站。

import sys"""
python import模块时, 是在sys.path里按顺序查找的。
sys.path是一个列表,里面以字符串的形式存储了许多路径。
使用KNN.py文件中的函数需要先将它的文件路径放到sys.path中
"""
sys.path.append(r"E:\楚楚猫\code\python\02NLP\01文本分析")from KNN import knn, euclidean_distancedef recommend_movies(movie_query, k_recommendations):raw_movies_data = []with open('./data/movies_recommendation_data.csv', 'r') as md:# Discard the first line (headings)next(md)# Read the data into memoryfor line in md.readlines():data_row = line.strip().split(',')raw_movies_data.append(data_row)# Prepare the data for use in the knn algorithm by picking# the relevant columns and converting the numeric columns# to numbers since they were read in as stringsmovies_recommendation_data = []for row in raw_movies_data:data_row = list(map(float, row[2:]))movies_recommendation_data.append(data_row)# Use the KNN algorithm to get the 5 movies that are most# similar to The Post.recommendation_indices, _ = knn(movies_recommendation_data, movie_query, k=k_recommendations,distance_fn=euclidean_distance, choice_fn=lambda x: None)movie_recommendations = []for _, index in recommendation_indices:movie_recommendations.append(raw_movies_data[index])return movie_recommendationsif __name__ == '__main__':the_post = [7.2, 1, 1, 0, 0, 0, 0, 1, 0]  # feature vector for The Postrecommended_movies = recommend_movies(movie_query=the_post, k_recommendations=5)# Print recommended movie titlesfor recommendation in recommended_movies:print(recommendation[1])

movies_recommendation_data.csv数据获取链接

Summary

KNN算法是一种简单的监督学习算法,用于解决分类问题和回归问题。它很容易实现和理解,但有一个主要缺点,随着数据大小的增长,速度会明显变慢。

KNN的工作原理是查询Query与数据中所有示例之间的距离,选择最接近查询的指定数量(K)。然后投票选出最频繁的标签(在分类的情况下)或对标签进行平均(在回归的情况)

参考文献

[1]Machine Learning Basics with the K-Nearest Neighbors Algorithm
[2]在一个.py文件中调用另一个py文件中的类或函数
[3]一篇文章入门python基础

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM - 训练与推理过程中的 GPU 算力评估

目录 一.引言 二.FLOPs 和 TFLOPs ◆ FLOPs [Floating point Opearation Per Second] ◆ TFLOPs [Tera Floating point Opearation Per Second] 三.训练阶段的 GPU 消耗 ◆ 影响训练的因素 ◆ GPT-3 训练统计 ◆ 自定义训练 GPU 评估 四.推理阶段的 GPU 消耗 ◆ 影响…

Pap.er for Mac:高清壁纸应用打造你的专属视觉盛宴

在浩瀚的互联网海洋中,你是否曾为寻找一张心仪的高清壁纸而烦恼?或者是在大量的壁纸应用中感到困扰,不知道哪一个能满足你的需求?今天,我要向你介绍的,是一款独特的5K高清壁纸应用——Pap.er for Mac。 Pa…

leetcode:374. 猜数字大小(二分查找)

一、题目 函数原型:int guessNumber(int n) 二、思路 本题其实就是从 1 - n 中找出所要的答案。利用guess函数来判断数字是否符合答案。 答案小于当前数字,guess函数返回-1 答案等于当前数字,guess函数返回0 答案大于当前数字,gue…

Android NDK开发详解之ndk-build 脚本

Android NDK开发详解之ndk-build 脚本 内部原理从命令行调用选项可调试 build 与发布 build要求 ndk-build 脚本使用 NDK 的基于 Make 的构建系统构建项目。我们针对 ndk-build 使用的 Android.mk 和 Application.mk 配置提供了更具体的文档。 内部原理 运行 ndk-build 脚本相…

JVM 分代垃圾回收过程

堆空间划分了代: 年轻代(Young Generation)分为 eden 和 Survivor 两个区,Survivor 又分为2个均等的区,S0 和 S1。 首先,新对象都分配到年轻代的 eden 空间,Survivor 刚开始是空的。 当 eden …

招生报名缴费小程序开发笔记(上)

前期调研 1.数字化趋势: 随着社会的数字化转型,越来越多的教育机构倾向于采用数字工具来简化和优化他们的招生和报名过程。招生报名缴费小程序是应对这一趋势的一种解决方案,可以提供高效、方便、快速的在线招生渠道。2.用户需求&#xff1a…

Jtti:Apache服务的反向代理及负载均衡怎么配置

配置Apache服务的反向代理和负载均衡可以帮助您分散负载并提高应用程序的可用性和性能。下面是一些通用的步骤,以配置Apache反向代理和负载均衡。 1. 安装和配置Apache: 确保您已经安装了Apache HTTP服务器。通常,Apache的配置文件位于/etc…

VSCode-C/C++环境配置

0.下载VSCode VSCode官网 Visual Studio Code - Code Editing. Redefined 1.安装VSCode 2.编译器下载与配置 2.1下载编译器安装包 编译器的安装包分为两种一种是在线的一种是离线的,其区别的特点如下 在线安装(只是个下载器,打开后还要下载各种东西…

RocketMQ生产者消息发送出去了,消费者一直接收不到怎么办?(Rocket MQ订阅关系一致性)

问题: 使用RocketMQ消息队列,生产者将数据发送出去了,但是生产者一致没接收到(或者是间隔好几分钟,突然接收到一条数据)怎么办?并且通过rocket web控制台查看消息的状态为NOT_ONELINE或者NOT_CONSUME&#…

韦东山D1S板子——利用xfel工具初始化内置64MB内存,并直接下载程序到内存运行

1、前言 (1)最近使用韦东山老师的D1S板子学习RISC-V架构知识,我是结合《RISC-V体系结构编程与实践》这本书的进行学习,其中韦东山老师对书中的代码做了部分移植,到MMU模块就没有在移植书中代码; &#xff0…

java毕业设计基于springboot+vue高校本科学生综评系统

项目介绍 本系统是利用Spring Boot框架而设计的一款结合用户的实际情况而设计的平台,利用VUE技术来将可供学生和管理员来使用的所有界面来显示出来,利用Java语言技术来编程实现用户和管理员所执行的各类操作业务逻辑,以MySQL数据库来存取系统…

把Qt6.2.4内置的标签打印了一遍

2023年10月31日&#xff0c;周二晚上 #include <QGridLayout> #include <QPushButton> #include <QLabel> #include <QApplication> #include <QStyle>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget widget;widget.set…

Python 数学函数和 math 模块指南

Python 提供了一组内置的数学函数&#xff0c;包括一个广泛的数学模块&#xff0c;可以让您对数字执行数学任务。 内置数学函数。min() 和 max() 函数可用于在可迭代对象中查找最低或最高值&#xff1a; 示例&#xff1a;查找可迭代对象中的最低或最高值&#xff1a; x min…

Webpack常见的插件和模式

文章目录 一、认识插件Plugin1.认识Plugin 二、CleanWebpackPlugin三、HtmlWebpackPlugin1.生成index.html分析2.自定义HTML模板3.自定义模板数据填充 四、DefinePlugin1.DefinePlugin的介绍2.DefinePlugin的使用 五、Mode配置 一、认识插件Plugin 1.认识Plugin Webpack的另一…

MySQL主从复制原理

1、MySQL主从复制的三个步骤及其原理图 slave会从master读取binlog来进行数据同步 MySQL复制过程分成三步&#xff1a; 1、master将改变记录到二进制日志&#xff08;binary log&#xff09;。这些记录过程叫做二进制日志事件&#xff0c;binary log events。 2、slave将ma…

AcWing 第127场周赛 构造矩阵

构造题目&#xff0c;考虑去除掉最后一行最后一列先进行考虑&#xff0c;假设除了最后一行和最后一列都已经排好了&#xff08;你可以随便排&#xff09;&#xff0c;那么分析知最后一个数字由限制以外其他都已经确定了&#xff0c;无解的情况是k为-1 并且n&#xff0c;m的奇偶…

【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;如果不使用synchronized…

【Linux】虚拟机部署与发布J2EE项目(Linux版本)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…

零资源的大语言模型幻觉预防

零资源的大语言模型幻觉预防 摘要1 引言2 相关工作2.1 幻觉检测和纠正方法2.2 幻觉检测数据集 3 方法论3.1 概念提取3.2 概念猜测3.2.1 概念解释3.2.2 概念推理 3.3 聚合3.3.1 概念频率分数3.3.2 加权聚合 4 实验5 总结 摘要 大语言模型&#xff08;LLMs&#xff09;在各个领域…

FedGNN: Federated Graph Neural Network for Privacy-Preserving Recommendation

FedGNN&#xff1a;用于隐私保护推荐的联邦图神经网络 参考笔记 ICML-21-workshop 本文的主要创新工作 在具有局部差分隐私的模型训练中保护模型梯度&#xff0c;并提出一种伪交互项目采样技术来保护用户与之交互的项目。提出了一种保护隐私的用户-项目图扩展方法&#xff0…