机器学习小记——KNN(K近邻)

news/2024/7/27 7:29:18/文章来源:https://blog.csdn.net/2301_81940605/article/details/135617269

为了让绝大多数人都可以看懂,所以我就用简单的话语来讲解机器学习每一个算法

第一次写ML的博文,所以可能会有些地方出错,欢迎各位大佬提出意见或错误

祝大家开心进步每一天~

博文代码全部为python

简单的说一下什么是机器学习,机器学习英文名称是Machine Learning, ML

机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

机器学习学习形式可分为监督学习,监督学习,半监督学习和强化学习

KNN(k-Nearest Neighbor)中文名为K近邻,是分类算法的一种,KNN的思路为在在数据和标签已知的情况下将测试数据的特征和训练集中的特征进行比较,找到与之最相似的k的数据,那么这个数据对应的类别就是k个数据中出现次数最多的那个类别

寻找相似度有多重方法,最常用的为欧几里得度量,皮尔逊相关系数,余弦相似度

算法流程大致分为

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。


本文使用iris数据集,可从UCI处下载    传送门

使用py的三种库pandas,numpy,sklearn

查看数据集

前4列为特征,最后一列为标签

1 #获取数据
2 X=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
3 y=np.loadtxt("/Users/galan/py/ML-D/iris.data.txt",delimiter=",",dtype=str,usecols=(4,))
4 #创建训练数据和测试数据
5 X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=.7)

第2,3行为获取特征和标签

第五行中使用sklearn库的train_test_split函数,用来方便分隔测试集和训练集

本文使用欧几里得度量算法,在下方也会列出皮尔逊相似性和余弦相似度的py代码

欧几里得度量多为计算空间中两点间的距离

表达式为    |x| = √( x[1]2 + x[2]2 + … + x[n]2 )

代码表现形式为  [(p1-q1)**2+(p2-q2)**2+…+(pn-qn)**2]**0.5

def eculidean(p,q):sumSq=0.0#讲差值德平方累加起来for i in range(len(p)):sumSq+=sum(p[i]-q[i])**2#求平方根return (sumSq**0.5)

皮尔逊相关系数是度量两个变量之间相关程度,介于-1和1之间,1代表变量完全正相关,0代表无关,-1代表完全负关系

def pearson(x,y):n=len(x)vals=range(n)#简单求和sumx=sum([float(x[i]) for i in vals])sumy=sum([float(y[i]) for i in vals])#求平方和sumxSq=sum([x[i]**2.0 for i in vals])sumySq=sum([y[i]**2.0 for i in vals])#求乘积之和pSum=sum([x[i]*y[i] for i in vals])#计算皮尔逊评价值num=pSum-(sumx*sumy/n)den=((sumxSq-pow(sumx,2)/n)*(sumySq-pow(sumy,2)/n))**.5if den==0:return 1r=num/denreturn r

余弦相似度将向量根据坐标值,绘制到向量空间中求得他们的夹角,并得出夹角对应的余弦值,夹角越小,余弦值越接近于1,它们的方向更加吻合,则越相似。

#vect1,vect2位两个一维向量如(1,1)
def getCost(vect1,vect2):sum_x=0.0sum_y=0.0sum_xy=0.0for a,b in zip(vect1,vect2):sum_xy+=a*bsum_x+=a**2sum_y+=b**2if sum_x==0.0 or sum_y==0.0:return Noneelse:return sum_xy/((sum_x*sum_y)**0.5)

knn的求证过程

#K值
k=5
#计算所有的欧氏距离组合成字典
Dists={}
for i in range(len(X_train)):Dists[eculidean(X_test[0],X_train[i])]=y_train[i]
#排序字典
sortedDist=sorted(Dists.iteritems(),reverse=True,key=lambda x:x[0])[:k]
classCount={}
#寻找最多的类别标签
for i in sortedDist:if i[1] in classCount:classCount[i[1]]+=1else:classCount[i[1]]=1
print classCount

下面贴出所有的代码

#coding:utf-8
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split#获取数据
X=np.loadtxt("./ML-D/iris.data.txt",delimiter=",",dtype=float,usecols=(0,1,2,3))
y=np.loadtxt("./ML-D/iris.data.txt",delimiter=",",dtype=str,usecols=(4,))
#创建训练数据和测试数据
X_train,X_test,y_train,y_test=train_test_split(X,y,train_size=.7)def eculidean(p,q):sumSq=0.0#讲差值德平方累加起来for i in range(len(p)):sumSq+=sum(p-q[i])**2#求平方根return (sumSq**0.5)def classify(X_train,X_test,k):#计算所有的欧氏距离Dists={}for i in range(len(X_train)):Dists[eculidean(X_test,X_train[i])]=y_train[i]#排序字典sortedDist=sorted(Dists.iteritems(),reverse=True,key=lambda x:x[0])[:k]classCount={}#寻找最多的类别标签for i in sortedDist:if i[1] in classCount:classCount[i[1]]+=1else:classCount[i[1]]=1return sorted(classCount.iteritems(),key=lambda x:x[1],reverse=True)if __name__ == '__main__':print "%s的类别为%s"%(X_test[15],classify(X_train,X_test[0],5)[0][0])

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

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

相关文章

adb wifi 远程调试 安卓手机 命令

使用adb wifi 模式调试需要满足以下前提条件: 手机 和 PC 需要在同一局域网下。手机需要开启开发者模式,然后打开 USB 调试模式。 具体操作步骤如下: 将安卓手机通过 USB 线连接到 PC。(连接的时候,会弹出请求&#x…

Android 系统启动过程纪要(基于Android 10)

前言 看过源码的都知道,Launcher系统启动都会经过这三个进程 init ->zygote -> system_server。今天我们就来讲解一下这三个进程以及Launcher系统启动。 init进程 准备Android虚拟机环境:创建和挂载系统文件目录;初始化属性服务&…

AI大模型预先学习笔记二:prompt提问大模型、langchain使用大模型框架、fine tune微调大模型

文章目录 一、Prompt Engineering(怎么去提问大模型)1)环境准备2)交互代码的参数备注3)交互代码 二、LangChain(一个框架去使用大模型)1)LangChain核心介绍:I/O模块、数据…

Java NIO (二)NIO Buffer类的重要方法

1 allocate()方法 在使用Buffer实例前,我们需要先获取Buffer子类的实例对象,并且分配内存空间。需要获取一个Buffer实例对象时,并不是使用子类的构造器来创建,而是调用子类的allocate()方法。 public class AllocateTest {static…

四、Sharding-JDBC系列04:分库分表后,如何不停机迁移数据?

目录 停机迁移方案 双写迁移方案 一般会有两种方案: 停机迁移方案 这种方案最简单也是最low的。 数据迁移前,在网站或者app挂个公告,说0点到早上6点系统进行维护,无法访问。 接着到0点停机,系统停掉,…

k8s---配置资源管理

目录 配置资源管理的方式 secret pod如何来引用secret??? 陈述式创建: 声明式创建 Secret创建加密文件 使用token挂载 环境变量使用 docker-registry ConfigMap 陈述式 热更新 总结: 配置资源管理的方式 …

Go-gin-example 第二部分 jwt验证

文章目录 使用 JWT 进行身份校验jwt知识点补充认识JWTTOKEN是什么jwt的使用场景jwt的组成headerpayloadsignature 下载依赖包编写 jwt 工具包jwt中间件编写如何获取token 编写获取token的Apimodels逻辑编写路由逻辑编写修改路由逻辑 验证token将中间件接入Gin功能验证模块 续接…

【开源】基于JAVA语言的固始鹅块销售系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

FPGA之初探

FPGA的构成 基本逻辑单元CLB CLB是FPGA的基本逻辑单元, 一个 CLB 包括了 2 个 Slices,所以知道Slices的数量就可以知道FPGA的“大概”逻辑资源容量了。一个 Slice 等于 4 个6输入LUT8个触发器(flip-flop)算数运算逻辑,每个 Slice 的 4 个触发…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

Komodor:Kubernetes 监控工具全面指南

为了方便起见,Komodor 提供了一个简单的 Web 界面,以帮助您监控 Kubernetes 集群的状态。它拥有付费和免费增值计划,除了在出现问题时通知用户外,还拥有一系列方便的工具,用于跟踪和管理集群中部署的资源的状态。让我们…

如何用GPT进行论文润色与改写?

详情点击链接:如何用GPT进行论文润色与改写? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定…

逻辑回归(解决分类问题)

定义:逻辑回归是一种用于解决分类问题的统计学习方法。它通过对数据进行建模,预测一个事件发生的概率。逻辑回归通常用于二元分类问题,即将数据分为两个类别。它基于线性回归模型,但使用了逻辑函数(也称为S形函数&…

MR-GCN

∘ Φ \circ_Φ ∘Φ​ denotes a convolution Let b l o c k d i a g blockdiag blockdiag(A) be a n1n3-by-n2n3 block diagonal matrix, f o l d fold fold indicate its inverse operator diagonal degree tensor D \mathcal{D} D 作者未提供代码

【学习心得】Git深入学习

若您还未安装Git或是只想简单使用,可以先看看我的文章“Git快速上手”【学习心得】Git快速上手http://t.csdnimg.cn/gsaGj 一、深入学习Git必须熟悉两个概念 (1)【四个区】Git本地有三个区,远程仓库也可以看出成一个区域 工作区…

vtk9.3 + Visual Studio2019 + Cmake3.28 win11 上的环境安装(这个过程网上比较多,自己记录下过程加深下印象)

开始 介绍 欢迎来到 VTK!我们建议您首先阅读《VTK book》,这是一本全面的 VTK 指南,涵盖了其功能的所有方面。此外,您可能会发现探索 VTK 示例很有帮助,这是一组有用的参考资料,演示了如何使用 VTK 的不同模…

ASP.NET Core 的 Web Api 实现限流 中间件

Microsoft.AspNetCore.RateLimiting 中间件提供速率限制(限流)中间件。 它是.NET 7 以上版本才支持的中间件,刚看了一下,确实挺好用,下面给大家简单介绍一下: RateLimiterOptionsExtensions 类提供下列用…

Elasticsearch 7.8.0从入门到精通

安装Elasticsearch 7.8.0 官网:Elasticsearch 7.8.0 | Elastic 大家下载所需要的安装包即可。然后解压缩: Elasticsearch是通过java编写的,所以自带jdk。多好,下载Elasticsearch赠送jdk 0.0,不过一般我们用自己的jdk…

利用Lambda表达式实现vector中pair/结构体的排序

众所周知&#xff0c;对于vector<pair<int, int> >若直接使用sort排序&#xff0c;会默认按照pair的第一个关键字从小到大进行排序&#xff1a; #include <bits/stdc.h>using namespace std;int main() {vector<pair<int, int> > p;p.push_back…

select子句简单查询

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 目录 数据查询 起别名 连接 ​编辑 去重 ​编辑 另外补充几个不常用的命令 如果要进行查询,那么需要使用数据操纵语言&#xff08;Data Manipulation Language&#xff0c;DML&am…