KNN算法代码

article/2025/9/7 7:54:10

一、K近邻算法

        KNN是一种监督学习类别的算法,全称(K-NearestNeighbor)直译为K个最近的邻居,是一种聚类算法。该算法认为我们在判断一个物体的类别可以根据与他非常相似的K个物体的类别(这K个物体的类别是已知的)来决定。其工作机制是给定一个新的测试样本,基于某种距离度量找出训练集中离该新样本最近的前K个样本(训练集中样本标签已知),基于这K个样本的标签信息来预测新样本的类别,通常,在这K个样本中出现最多次数的类别标签即被预测为新样本的类别标签。

二. 使用Python导入数据

首先创建一个KNN.py文件,在文件中输入以下代码:


 

from numpy import * #导入numpy库
import operator #导入operator模块
#以下代码定义了一个数据集,其中包含数据与对应的分类标签信息
def createDataSet():group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels=['A','A','B','B']return group,labels

保存KNN.py文件,并改变当前路径到存储KNN.py的位置,打开Python开发环境。
输入以下代码导入KNN模块:

group,labels=KNN.createDataSet()
print(group)
print(labels)
输出为:
[[1.  1.1][1.  1. ][0.  0. ][0.  0.1]]
['A', 'A', 'B', 'B']

三、从文本中解析数据

具体代码如下:

def calssify0(inX,dataSet,labels,k): dataSetSize=dataSet.shape[0] diffMat=numpy.tile(inX,(dataSetSize,1))-dataSet sqDiffMat=diffMat**2sqDistances=sqDiffMat.sum(axis=1) distances=sqDistances**0.5 sortedDistIndicies=distances.argsort() classCount={} for i in range(k):voteIlabel=labels[sortedDistIndicies[i]] classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 sortclassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) return sortclassCount[0][0] 

即通过欧式距离公式,计算两点的距离并选择距离最小的K个点并排序

欧式距离公式:

文本数据:

四、示例:

        海伦一直使用在线约会网站寻找适合自己的约会对象。尽管约会网站会推荐不同的
人选,但她并不是喜欢每一个人。经过一番总结,她发现曾交往过三种类型的人:
                不喜欢的人
                魅力一般的人
                极具魅力的人
        尽管发现了上述规律,但海伦依然无法将约会网站推荐的匹配对象归入恰当的分类。她觉得可以在周一到周五约会那些魅力一般的人,而周末则更喜欢与那些极具魅力的人为伴。海伦希望我们的分类软件可以更好地帮助她将匹配对象划分到确切的分类中。此外海伦还收集了一些约会网站未曾记录的数据信息,她认为这些数据更有助于匹配对象的归类。

1.从文本文件中解析数据:

        海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件datingTestSet.txt中,每
个样本数据占据一行,总共有1000行。海伦的样本主要包含以下3种特征:
 每年获得的飞行常客里程数
 玩视频游戏所耗时间百分比
 每周消费的冰淇淋公升数
        在将上述特征数据输入到分类器之前,必须将待处理数据的格式改变为分类器可以接受的格式。在kNN.py中创建名为file2matrix的函数,以此来处理输入格式问题。该函数的输入为文件名字符串,输出为训练样本矩阵和类别标签向量。

def files2matrix(filename):fr=open(filename)arraylines=fr.readlines() lenoflines=len(arraylines) #返回集合长度,这里的集合一行为一个元素matrix=np.zeros((lenoflines,3))#创建全0矩阵,行数为lenoflines,列数为3labelmatrix=[] #创建空集合index=0for line in arraylines:line=line.strip() listFromline=line.split('\t') matrix[index,:]=listFromline[0:3] labelmatrix.append(int(listFromline[-1])) index+=1return matrix,labelmatrix

2.分析数据:使用Matplotlib 创建散点图

import matplotlib
import matplotlib.pyplot as plt
import pylab
matplotlib.rcParams['font.sans-serif'] = ['SimHei'] #使中文字符能被显示在图表中
fig=plt.figure()
ax=fig.add_subplot(111) #图表画在分成一行一列的第一个表格中
ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15*np.array(datingLabels),15*np.array(datingLabels)) 
ax.set_xlabel('玩视频游戏所耗时间百分比')
ax.set_ylabel('每周所消费的冰淇淋公升数')
plt.show()

3.未写色彩标记代码

ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15*np.array(datingLabels),15*np.array(datingLabels)) 

输出效果:

 加入色彩标记后效果:

 5.归一化特征值代码:

import numpy as np
def autoNorm(dataSet):minVals = dataSet.min(0) maxVals = dataSet.max(0) ranges = maxVals - minVals normDataSet = np.zeros(np.shape(dataSet)) #创建形状大小与dataSet一样的0矩阵m = dataSet.shape[0] #m为dataSet行数normDataSet = dataSet - np.tile(minVals, (m,1)) normDataSet = normDataSet/np.tile(ranges, (m,1))   return normDataSet, ranges, minVals

6.测试算法代码:

def datingClassTest():hoRatio = 0.50     datingDataMat,datingLabels = files2matrix('datingTestSet2.txt')       m = normMat.shape[0] #获取normMat的行数numTestVecs = int(m*hoRatio)errorCount = 0.0for i in range(numTestVecs):classifierResult              =calssify0(normMat[i,:],normMat[numTestVecs:m,:],datingLabels[numTestVecs:m],3) print ("the classifier came back with: %d, the real answer is: %d" %                         (classifierResult, datingLabels[i]))if (classifierResult != datingLabels[i]): errorCount += 1.0 print ("the total error rate is: %f" % (errorCount/float(numTestVecs)))

7.使用算法:构建完整可用系统

上面我们已经在数据上对分类器进行了测试,现在终于可以使用这个分类器为海伦来对人们分类。我们会给海伦一小段程序,通过该程序海伦会在约会网站上找到某个人并输入他的信息。程序会给出她对对方喜欢程度的预测值

def classifyperson():resultList=['not at all','in small doses','in large doses']percentTats=float(input("percentage of tiome spent playing video games?")) ffMiles=float(input("frequent flier miles earned per year?"))iceCream=float(input("liters of ice cream consumed per year?"))datingDatMat,datingLabels=files2matrix('datingTestSet2.txt') #读取文件normMat,ranges,minVals=autoNorm(datingDatMat) #数据归一化inArr=np.array([ffMiles,percentTats,iceCream]) #创建数组classifierResult=calssify0((inArr-minVals)/ranges,normMat,datingLabels,3) print("You will probably like this person:",resultList[classifierResult-1])

输出结果:

classifyperson()
out:
percentage of tiome spent playing video games?100frequent flier miles earned per year?90liters of ice cream consumed per year?10
You will probably like this person: in large doses

注:以上代码来自于《机器学习实战》


http://chatgpt.dhexx.cn/article/J1UyI4rX.shtml

相关文章

KNN数据缺失值填充(附源码和数据)不调用包

KNN估计 数据缺失值填充—KNN估计一、基本思想二、步骤1.导入数据2.查看空缺值3.取出要分析的数据4.计算平均值5.计算标准差6.规范化7.计算欧几里得距离8.最优解9.画图 总结 数据缺失值填充—KNN估计 运行环境 python3.6 jupyter notebook 一、基本思想 先将数据标准化&…

数据挖掘——KNN算法的实现

👨‍💻作者简介:练习时长两年半的java博主 📖个人主页:君临๑ 🎁 ps:点赞是免费的,却可以让写博客的作者开心好几天😎 文章目录 一、k-最近邻分类算法介绍 二、k-NN的特…

KNN算法调优

1.所用方法: 交叉验证与网格搜索 交叉验证(为了让被评估的模型更加精确可信): 所有训练集数据分成N等分,几等分就是几折交叉验证 网格搜索:调参数 K-近邻:超参数K 2.API: sklearn.model_selection.GridSearchCV: CV即cross validation…

计算机编程—必备基础知识点

目录: 1. 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别 2. 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1. 编程语言 1.1 编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编…

计算机概论--计算机基础知识快速入门

0.前言1.计算机:辅助人脑的好工具 1.1计算机硬件的五大单元1.2CPU的种类1.3接口设备1.4运作流程 2.个人计算机架构与接口设备 2.1CPU2.2内存2.3显卡2.4硬盘与存储设备2.5主板 3.软件程序执行 3.1机器程序与编译程序3.2操作系统 3.2.1操作系统内核3.2.2系统调用 3.3小…

0基础如何开始学习计算机知识?

一、计算机的基本操作 计算机中只有文件和文件夹 计算机中,只有两样东西,文件和文件夹。 文件夹:本身不存储数据内容。文件夹是用来组织和管理文件的。 文件: 所有的txt文本文档,音乐,视频,图…

【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解

这是一个新坑,希望大家喜欢 电脑的基础知识大全,你确定都知道? 一、软件系统 软件系统包括:操作系统、应用软件等。应用软件中电脑行业的管理软件,IT电脑行业的发展必备利器,电脑行业的erp软件。 二、硬件系统 硬件系…

计算机知识01:计算机基础知识入门

1. 计算机运行流程 如果不是很了解电脑运行流程的话,我们可以类比一下,假设电脑是一个人体,那么每个元件对应到哪个地方呢?可以这样思考: CPU脑袋:每个人会做的事情都不一样(微指令集的差异&a…

IP地址(IP Address)

IP Address在网络中,通信节点都需要一个IP地址 以点分十进制表示,有32位二进制构成(大约43亿) 分为两个部分:网络位和主机位 网络位:代表IP地址所属的网段 主机位:代表网点上的某个节点 由子…

IP地址构成 ,以及如何求“网络地址“以及“广播地址“

IP地址(英语:IP Address, 全称:Internet Protocol Address)又称互联网协议地址。当设备连接网络,设备将被分配一个IP地址,用作标识。通过IP地址,设备间可以互相通讯,如果没有IP地址&…

电话号码对应的英语单词

问题: 电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb......... 1、您能否可以根据这样的对应关系设计一个程序&#xff…

地址的概念

前言:地址的概念 1. 地址概念及各个单位换算1.1 地址的概念1.2 单位换算1.3 举例说明,加深理解1.4 关于地址的宽度 1. 地址概念及各个单位换算 1.1 地址的概念 计算机内的数据是存储在地址里面的,地址又是以字节(Byte&#xff09…

地址的地址?

在visual studio 2019中 #include <stdio.h> #include <stdlib.h> typedef struct student { int value; struct student* next_stu; }Student; Student * creatlist(); void insertlist(Student * list,int value); int main() { Student *my_list…

GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)

转载▼ 标签&#xff1a; 杂谈 国内的有道词典和金山词典由于使用方便、宣传到位得到了许多同学的喜爱。在开源软件的领域&#xff0c;也有一款非常好用的词典GoldenDict&#xff0c;它的强项在于可以直接使用众多词典厂商的词库。那些正规的词典厂商通常购买了词典的版权…

【GO】map转json

咔咔博客之map转json 跟结构体转json一样都使用的是json.Marshal()方法 最后需要就是把字节转为字符串使用string即可 案例 func main() {// 定义了interface 后边就可以跟任意类型了mMap : make(map[string]interface{})mMap["博客地址"] "blog.fangkang.to…

Json4s的一些用法 JSon转对象实体 Json转Map Map转Json

Json4s 全称就是Json For Scala&#xff0c;为Scala而生 首先上Maven依赖配置&#xff0c;其实Spark中自带了Json4s如果是编写Spark代码,并不需要单独引用Json4s的依赖了 <dependency><groupId>org.json4s</groupId><artifactId>json4s-jackson_2.11&…

map转json字符串字段排序

需求&#xff1a;map转成json字符串&#xff0c;要求字段按字母升序排列 package com.data.test;import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFe…

Map与JSON数据之间的互相转化

Map与JSON mapmap转JSON字符串JSON字符串转JSON对象Map转JSON对象JSON字符串转MapJSON对象转MapJSON对象转JSON字符串IDEA功能快捷键 map 此内容是方便博主自己记忆内容&#xff0c;不用于公开学习资料&#xff0c;若发现语法错误&#xff0c;自行更正&#xff0c;勿喷 map转…

Map和JSON之间的转化

Map和JSON之间的转化 1 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>2 测试 2.1 Map转JSON //1.map转jsonTestpublic void testJson01()…

js中三个等号

&#xff1a;三个等号我们称为等同符&#xff0c;当等号两边的值为相同类型的时候&#xff0c;直接比较等号两边的值&#xff0c;值相同则返回true&#xff0c;若等号两边的值类型不同时直接返回false。