机器学习-KNN算法

news2025/1/17 5:59:23

机器学习-KNN算法

没有什么比顺其自然更有超凡的力量。没有什么比顺乎本性更具有迷人的魔力。

目录

机器学习-KNN算法

1.K近邻算法

2.KNN决策方式

1)KNN分类预测规则

1)KNN回归预测规则

3.KNN三要素

4.KNN算法实现方式

1)蛮力实现

2)KD树

3)KD树实例


1.K近邻算法

KNN(K-Nearest Neighbors)算法是一种简单而又强大的监督学习算法,常用于分类和回归问题。它的原理非常直观:预测一个样本的标签,就是找出距离该样本最近的 K 个邻居,然后根据这 K 个邻居的标签来决定该样本的标签。

让我用通俗易懂的方式来解释一下KNN算法的工作原理:

1. 收集数据:首先,我们需要收集有标签的训练数据,包括输入特征和对应的标签。

2. 选择邻居数量 K:确定一个合适的邻居数量 K,这是KNN算法中的一个重要参数。通常情况下,选择一个合适的 K 值可以通过交叉验证或者经验法则来确定。

3. 计算距离:对于给定的测试样本,计算它与训练集中所有样本的距离。常用的距离度量方法包括欧式距离、曼哈顿距离等。

4. 找出最近的邻居:根据计算得到的距离,找出距离测试样本最近的 K 个训练样本,这些样本就是该测试样本的邻居。

5. 投票表决:对于分类问题,采用多数表决的方式,即将这 K 个邻居中出现次数最多的类别作为测试样本的预测类别;对于回归问题,通常采用这 K 个邻居的平均值作为预测值。

6. 预测:根据投票结果或者平均值,确定测试样本的标签或者数值。

KNN算法简单易懂,不需要模型训练过程,而是直接利用训练集中的样本进行预测。然而,KNN算法的计算复杂度较高,特别是在处理大规模数据集时,计算距离的时间开销比较大。此外,KNN算法对数据的缩放和特征选择也比较敏感。

总的来说,KNN算法是一个适用于小型数据集且容易理解的强大工具,尤其适用于非线性和非参数化的问题。

2.KNN决策方式

1)KNN分类预测规则

①多数表决法

②加权多数表决法

1)KNN回归预测规则

①平均值法

②加权平均值法

3.KNN三要素

距离的度量:欧式距离

求被测点到所有点的距离 取最近的k个

4.KNN算法实现方式

1)蛮力实现
2)KD树

KD树是按照列的方差来构建的

3)KD树实例

代码展示

#coding=UTF-8
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegressionCV
from sklearn import metrics
from sklearn.preprocessing import label_binarize
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import matplotlib as mpl
import  matplotlib.pyplot as plt
defaultencoding = 'utf-8'
mpl.rcParams['font.sans-serif']=[u'simHei']
mpl.rcParams['axes.unicode_minus']=False
#加载数据
datas=pd.read_csv("data/iris.data",header=None)#加载iris.data数据
#数据处理
datas=datas.replace("?",np.NaN)#把?号用NaN替换
datas=datas.dropna(how="any",axis=1)#删除NaN行
#提取X和Y
X=datas.iloc[:,0:-1]#取0到最后一列前一列
#对种类英文编码
Y=pd.Categorical(datas[4]).codes#对最后一列做编码
print(Y)
#对数据进行拆分
#逻辑回归是用来判断 y属于哪一个种类 1 0
train_x,test_x,train_y,test_y=train_test_split(X,Y,test_size=0.2,random_state=1)
#创建模型和训练模型
ss=StandardScaler()
train_x=ss.fit_transform(train_x)#把trainx数据标准化
test_x=ss.transform(test_x)#把testx数据标准化

logistic=LogisticRegressionCV(random_state=2,multi_class="ovr")
logistic.fit(train_x,train_y) #能够识别三种花模型 求theta
#评估
proba=logistic.predict_proba(test_x)#每条记录每个种类的概率 30 3

ymy=label_binarize(test_y,classes=(0,1,2))#转换成哑编码 30 3

fpr,tpr,threshold=metrics.roc_curve(ymy.ravel(),proba.ravel())#ravel拉平,变成一维
auc=metrics.auc(fpr,tpr)#根据fpr tpr计算面积
print("auc",auc)

knn=KNeighborsClassifier(n_neighbors=5,algorithm="kd_tree")
knn.fit(train_x,train_y) # 构建kd树
test_y_hat=knn.predict(test_x)
proba_knn=knn.predict_proba(test_x)
fpr1,tpr1,threshold1=metrics.roc_curve(ymy.ravel(),proba_knn.ravel())
auc1=metrics.auc(fpr1,tpr1)
print(auc1)

plt.figure()
#画逻辑回归算法ROC曲线
plt.plot(fpr,tpr,color='red',label='回归ROC auc:'+str(auc))
plt.plot(fpr1,tpr1,color='green',label='knnROC auc:'+str(auc1)) # kd树
plt.legend()
plt.show()

运行结果

5.目标函数 损失函数

 目标函数和损失函数的区别就是用在什么地方

6.交叉验证

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

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

相关文章

C++ C# 贝塞尔曲线

二阶贝塞尔曲线公式 三阶贝塞尔曲线公式 C 三维坐标点 二阶到N阶源码 //二阶公式: FVector BezierUtils::CalculateBezierPoint(float t, FVector startPoint, FVector controlPoint, FVector endPoint) {float t1 (1 - t) * (1 - t);float t2 2 * t * (1 - t);…

【JS红宝书学习笔记】第1、2章 初识JS

第1章 什么是JavaScript JavaScript 是一门用来与网页交互的脚本语言,包含以下三个组成部分。 ECMAScript:由 ECMA-262 定义并提供核心功能。文档对象模型(DOM):提供与网页内容交互的方法和接口。浏览器对象模型&…

Dubbo3.x 异步转同步源码

底层netty通信是异步的,那我们平时调用采取的同步是如何将底层的异步转为同步的呢? dubbo远程rpc协议和网络框架有多种,我们以默认的dubbo协议、网络框架netty作为切入点. 注意点:debug时将过期时间设置长一点: 调用…

【高阶数据结构】并查集 {并查集原理;并查集优化;并查集实现;并查集应用}

一、并查集原理 在一些应用问题中,需要将n个不同的元素划分成一些不相交的集合。开始时,每个元素自成一个单元素集合,然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类…

2024年Java程序员的职业发展路径

程序员的职业路径是非常清晰的,但是现实情况下,很多人卡在了高级开发就再也上不去,直到遇到职业发展的危机,比如: 35岁大龄程序员找工作难,国内很多大型互联网公司在招聘要求上,会限制35岁这个年…

记录Spring Boot 2.3.4.RELEASE版注解方式实现AOP和通知的执行顺序

1.advice 按照以下的顺序执行 输出结果:(正常和异常) 说明:Spring boot 2.3.4.RELEASE 版本使用的AOP是spring-aop-5.2.9.RELEASE,AOP的通知顺序不一样。 可以测试下Spring boot 2.1.1.RELEASE 版做对比,发现结果是不一样的。 2…

算法-卡尔曼滤波之卡尔曼滤波的第一个方程:状态更新方程

通过一个例子来引出卡尔曼滤波的状态更新方程; 这里系统状态是金条的重量; 为了估计系统的状态,我们可以多次测量金条的重量,然后求平均值; 其中估计值是所有测量值的平均值; 由于我们使用的是静态模型&am…

灵活的静态存储控制器 (FSMC)的介绍(STM32F4)

目录 概述 1 认识FSMC 1.1 应用介绍 1.2 FSMC的主要功能 1.2.1 FSMC用途 1.2.2 FSMC的功能 2 FSMC的框架结构 2.1 AHB 接口 2.1.1 AHB 接口的Fault 2.1.2 支持的存储器和事务 2.2 外部器件地址映射 3 地址映射 3.1 NOR/PSRAM地址映射 3.2 NAND/PC卡地址映射 概述…

思维导图软件哪个好?5个软件教你自己快速制作思维导图

思维导图软件哪个好?5个软件教你自己快速制作思维导图 思维导图软件在现代生活和工作中扮演着重要的角色,它们可以帮助人们整理思维、规划项目、记录笔记等。以下是五款值得推荐的思维导图软件,它们各有特色,可以帮助您快速制作思…

开发者体验官:参与华为云CodeArts开发实践,赢取千元好礼!

CodeArts携华为云其他六大上云实践项目, 一起给大家送福利啦! 这次我们准备了华为全套电子产品, 包括但不限于华为智能音箱、耳机、摄像头,最高价值1000元! 只要体验完产品,提出相关的产品优化建议即有…

【020】基于JavaWeb实现的批报管理系统

项目介绍 基于jspservlet实现的批报管理系统采用B/S架构,该项目设计了一个角色管理员,管理员实现了我的案件、查询统计、项目维护等三大功能模块 技术栈 开发工具:Idea2020.3 运行环境:jdk1.8tomcat9.0mysql5.7 服务端技术:j…

wireshark_概念

ARP (Address Resolution Protocol)协议,即地址解析协议。该协议的功能就是将IP地址解析成MAC地址。 混杂模式 抓取经过网卡的所有数据包,包括发往本网卡和非发往本网卡的。 非混杂模式 只抓取目标地址是本网卡的数据包,对于发往…

算法练习第21天|216.组合总和|||、17.电话号码的字母组合

216.组合总和 III 216. 组合总和 III - 力扣(LeetCode)https://leetcode.cn/problems/combination-sum-iii/ 题目描述: 找出所有相加之和为 n 的 k 个数的组合,且满足下列条件: 只使用数字1到9每个数字 最多使用一…

历史影像的下载办法总结

最近想要下黄河口的历史影像,试验了几个办法: 1)参考文献1中的办法,用Global Mapper下载World Imagery Wayback网站的历史数据,能下载从2014年至现在的; 2)参考文献1中的办法,用SA…

SSL证书:守护网站安全的必要之选

随着互联网的飞速发展,网络安全问题愈发受到人们的关注。在这个信息爆炸的时代,数据的安全传输和用户的隐私保护成为了每个网站运营者必须面对的重要议题。而SSL证书,作为保障网站安全的重要工具,其重要性不言而喻。本文将详细探讨…

LeetCode416:分割等和子集

题目描述 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 解题思想 [1,5,11,5] 和为22,其中一半为 11。如果能寻找到若干数的和为11则成立可以抽象为一个0-1背包问题:容…

【Python 下载大量品牌网站的图片(二)】关于图片的处理和下载,吃满带宽,可多开窗口下载多个网站,DOS窗口类型

写作日期:2024.05.11 使用工具:Python 可修改功能:线程量、UA、Cookie、代理、存储目录、间隔时间、超时时间、图片压缩、图片缩放 默认功能:图片转换、断续下载、图片检测、路径处理、存储文件 GUI:DOS窗口 类型&…

有奖调研 | OpenSCA开源社区用户调研问卷

调研背景: 亲爱的OpenSCA开源社区用户,感谢您一路以来的支持与相伴。随着OpenSCA开源社区的不断发展,我们持续专注安全开发与开源治理实践,为全球用户提供一站式审查治理、SaaS云分析和精准情报预警的开源数字供应链安全赋能。 为…

gcc跟g++ -std=c99跟-std=c++11

报错: myshell.c: In function ‘int doBuildin(char**)’: myshell.c:91:12: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] path "."; 解决方案:这个waring提示我c11,也就是这里…

【csv-parse】使用parse方法的时候来转换为csv字符串时,会导致输出有乱码

😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:前端bug记录 👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进…