一篇文章入门KNN算法

news2024/11/21 0:32:23

文章目录

  • 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 math

def 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 data
    for 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 collection
        neighbor_distances_and_indices.append((distance, index))
    # 4. Sort the ordered collection of distances and indices from
    # smallest to largest (in ascending order) by the distances
    sorted_neighbor_distances_and_indices = sorted(neighbor_distances_and_indices)
    # 5. Pick the first K entries from the sorted collection
    k_nearest_distances_and_indices = sorted_neighbor_distances_and_indices[:k]
    # 6. Get the labels of the selected K entries
    k_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 labels
    return 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 = 0
    for 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_distance


def 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 memory
        for 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 strings
    movies_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_recommendations


if __name__ == '__main__':
    the_post = [7.2, 1, 1, 0, 0, 0, 0, 1, 0]  # feature vector for The Post
    recommended_movies = recommend_movies(movie_query=the_post, k_recommendations=5)

    # Print recommended movie titles
    for 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.coloradmin.cn/o/1154651.html

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

相关文章

手机型号抓取

Code处理结果:DataFrame 及 流程 方式①:每个页面的数据处理成df, 然后再合并df , pd.concat()/ df.append() 循环合并 方式②:原始数据中,每个页面的数据存储在一个列表中,然后页面中的每条数据以字典单元形式盛放在列…

数据查找(search)-----线性表查找

目录 前言 线性表查找 1.无序表查找 2.无序表查找 3.分块查找 前言 前面我们已经学习过了相关数据结构的知识,那么今天我们就开始去学习数据的查找,在不同的数据结构里面去查找目标数据,这就是数据的查找算法。今天就从线性结构的表去查…

QMS质量检验管理|攻克制造企业质量检验难题,助力企业提质增效

在日益激烈的市场竞争中,对产品质量严格把关,是制造企业提高核心竞争力与品牌价值的关键因素。那如何高效、高质地完成产品质检工作?这就需要企业在工业质检中引进数字化技术加以辅助,进而推动智能制造高质量发展。 蓝库云QMS质量…

VR全景对比在行业中如何呈现优势?功能有多强大?

我们在买车、买房或者是挑选旅游景区的时候,总是拿不定注意,彼此之间差异化细节处展现的并不明显,往往一个细节需要翻来覆去好几遍才能看懂。现在VR全景对比打破传统图片对比方式,让差异化效果更快展现! VR全景对比是通…

Simulink查表法实现NTC温度计算模型

目录 前言 把NTC数据导入到excel 把excel数据导入Matlab 拟合NTC温度曲线 查表实现温度计算 总结 前言 在实际项目中需要对NTC对某些区域进行温度采样和做一些系统层面的保护等等,比如过温降载,过温保护,这时就需要对NTC或者其他的温度传…

Docker之docker-compose(介绍,安装及入门示例)

文章目录 一、docker-compose介绍Compose 中有两个重要的概念: 二、docker-compose安装三、docker-compose简单示例参考网址: 一、docker-compose介绍 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。 Compo…

第7讲:VBA中利用FIND的代码实现多值查找实例

《VBA代码解决方案》(10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码摆好…

diffusers-AutoPipline

https://huggingface.co/docs/diffusers/tutorials/autopipelinehttps://huggingface.co/docs/diffusers/tutorials/autopipelineAutoPipeline会自动检测要使用的正确流程类,这样可以更轻松地加载与任务相对应的检查点,而无需知道具体的流程类名称。 1.…

.net core iis 发布后登入的时候请求不到方法报错502

.net core iis 发布后登入的时候请求不到方法报错502 502 bad gateway 502 - Web 服务器在作为网关或代理服务器时收到了无效响应。 您要查找的页面有问题,无法显示。当 Web 服务器(作为网关或代理)与上游内容服务器联系时,收到来自内容服务器的无效…

配置管理工具-Confd

1 简介 1.1 Confd介绍 Confd是一个轻量级的配置管理工具。通过查询后端存储,结合配置模板引擎,保持本地配置最新,同时具备定期探测机制,配置变更自动reload。对应的后端存储可以是etcd,redis、zookeeper等。[1] 通过…

2024年湖北黄冈建安ABC建筑企业专职安全员报名事项

2024年湖北黄冈建安ABC建筑企业专职安全员报名事项 专职安全员一般是指从事安全管理方面的工作,普遍的是建筑施工行业,建筑工地安全员,专职安全员C证,黄冈建筑安全员ABC-建筑单位在黄冈,只能在黄冈报考建筑安全员ABC。…

div 中文本太长用省略号隐藏展示,鼠标放上来弹出提示

需求描述 div 中有一行文本。 文本特别特别的长, 反正是超出了div所容纳的长度。 你呢, 现在想要的效果是: 1.文本就展示一行,多余的部分用省略号代替展示; 2.鼠标放上去的时候,用tip的方式展示完整的信息…

【AIFEM案例分析】药柱随机响应分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件,助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题,软件提供高效的前后处理工具和高精度的有限元求解器,帮助用户快速、深入地评估结构的力学性能,加速产…

三分钟学习一个python小知识9-----------我的对python中random的理解

文章目录 random库一、生成随机浮点数二、生成指定范围内的随机整数三、生成指定范围内的随机浮点数四、从序列中随机选择元素总结 random库 在Python中,random库是用于生成随机数的。 提示:以下是本篇文章正文内容,下面案例可供参考 一、生…

xx is not in the sudoers file. This incident will be reported

虚拟机再执行 sudo 命令的时候,出现类似这样的报错: xx is not in the sudoers file. This incident will be reported 其实,背景是这样的,我自己没事瞎作死,干了个这事,给 /etc/sudoers 文件的最下面一行…

软件开发全文档归档,开发、管理、实施、运维、服务巡检、信息安全、安全运维

在当今高度信息化的时代,软件开发已成为推动社会进步和发展的重要力量。软件开发过程中,文件支撑作为关键的一环,对于保障项目的顺利进行和产品的质量具有不可替代的作用。本文将探讨软件开发所需的主要文件及其作用。 一、引言 软件开发是…

C++核心编程---友元

目录 友元 友元的关键字 friend 友元的三种实现方式 1. 全局函数做友元 2. 类做友元 3. 成员函数做友元 友元 生活中你的家有客厅(Public),有你的卧室(Private) 客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进…

通过率90%的软件测试简历长什么样?

作为软件测试的从业者,面试或者被面试都是常有的事。 可是不管怎样,和简历有着理不清的关系,面试官要通过简历了解面试者的基本信息、过往经历等。 面试者希望通过简历把自己最好的一面体现给面试官,所以在这场博弈中&#xff0…

抖音小店怎么做?五步教你做好抖店,新手快来看!

我是电商珠珠 新手在做抖音小店的时候,往往在入驻完成之后,就不知道后续应该怎么操作了。 我将抖店的运营分为了五个步骤,可以供大家参考。 一、类目 开店之前选择好的类目,后续如果想要更改的话可以随时更改。 不过需要下架…

vue中watch实现翻译案例

翻译案例需要向在线接口发起一个Ajax请求,所以需要引入axios库。当输入一个单词或者文字时自动发起翻译请求。所以可以使用watch监听器来监听属性是否变更,当发生变化即发起翻译请求。 // 该方法会在数据变化时调用执行 // newValue新值, oldValue老值&…