K-近邻算法实战

【机器学习实战 Task1】 (KNN)k近邻算法的应用 1 背景 1.1 k近邻算法的概述 (1)k近邻算法的简介 k-近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。 (2)k近邻算法的工作原理 给定一个样本的集合,这里称为训练集,并且样本中每个数据都包含标签。对于新输入的一个不包含标签的数据,通过计算这个新的数据与每一个样本之间的距离,选取前k个,通常k小于20,以k个剧里最近的数据的标签中出现次数最多的标签作为该新加入的数据标签。 (3)k近邻算法的案例 当前统计了6部 阅读详情

前言:在彻底摸透《机器学习实战》课程中海伦约会网站配对案例之后,本次博客我将通过对案例的理解,运用k-近邻算法自己写一个关于鉴别一个学生是否是集美大学学生的程序

 

目录

一、算法样本数据集

二、k-近邻算法实现

三、读取数据集方法

四、图形可视化数据

五、数据归一化处理

六、测试算法准确率

七、算法实现

 

实验总结


 

一、算法样本数据集

        根据本届同专业同学的高考成绩(受地区教育资源原因,大概成绩区间在540-620之间)、近15天内刷卡进入图书馆次数、玩游戏所占日常个人时间比值。这三个特征值作为判断标准来作样本集合,将样本数据存储在自己编撰的text1.txt文本文件中,样本数量总共有300个,截图如下:

4952c0fe60d64073a2fb4e84224eb87a.png

 

二、k-近邻算法实现

        k-近邻算法的实现与之前写的博客中对k-近邻算法实现的理解相同,代码块部分并未作修改。

 

参考博客连接:

只会printf就要多学的k-近邻算法海伦网站配对案例分析

def knn(inX,dataSet,labels,k):

    dataSetSize = dataSet.shape[0]
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet
    sqDiffMat = diffMat**2
    sqDistances = 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
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

三、读取数据集方法

        读取数据集的方法也和之前博客对读取数据集的分析差不多,但是由于样本数据都是自己手打的,所以中间可能有些'\t'后又多按了空格什么的,在初次读取文本文件时,读取出来的有些数据格式不统一,在打开文本查阅后又没发现不妥之处,于是在中间加了一句line = line.replace(' ','\t'),将空格全部替换成'\t',这样在后面去掉'\t'之后数据格式全部统一了

def readFile(filename):
    fr = open(filename)
    lines = fr.readlines()
    line_num = len(lines)
    character_Mat = zeros((line_num,3))
    label_Mat = []
    index =0

    for line in lines:
        line = line.strip('\n')
        line = line.replace(' ','\t')
        line_list = line.split('\t')
        character_Mat[index,:] = line_list[0:3] 
        label_Mat.append(int(line_list[-1]))
        index = index+1

    return character_Mat,label_Mat

四、图形可视化数据

用图形化来观察数据样本分布是非常直观的一种选择,二维图像如下所示:(选取高考成绩和近15天进入图书馆次数为x轴和y轴)

fe57c8f3636843a8b8f75556c6d17f93.png

import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x=character_Mat[:,0]
y=character_Mat[:,1]
z=character_Mat[:,2]

fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x,y,15.0*array(label_Mat)+1,15.0*array(label_Mat)+1)

plt.show()

 改进:在考虑样本特征有三项之后,思考能否用三维图像看看数据分布,于是自行查找了matplotlib中三维图像的代码,并加以改写,得到结果如下

6ebb8cc58dbf4db4b79bc7db5e83acb6.png

import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

x=character_Mat[:,0]
y=character_Mat[:,1]
z=character_Mat[:,2]

fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x,y,z,c=15.0*array(label_Mat)+1,s=15.0*array(label_Mat)+1)

plt.show()

但是从图像上来看二者的差异并不是很明显,或许是因为我自己的数据样本的问题 

 

五、数据归一化处理

归一化处理同上一篇博客分析,目的是使得不让某些特征对分类判断的占比过大,于是将每一项特征值都处理成0-1的区间

def autoNorm(dataSet):
    min = dataSet.min(0)
    max = dataSet.max(0)
    ranges = max - min
    normDataSet = zeros(shape(dataSet))
    num = dataSet.shape[0]
    normDataSet = dataSet - tile(min, (num,1))
    normDataSet = normDataSet / tile(ranges, (num,1))
    return normDataSet,ranges,min

 

六、测试算法准确率

        在分类测试样本集和训练样本集中,需要人为的界定一些规则,使得测试样本和训练样本有所区别,而不是简单的前30%做测试和后70%做训练,但是在本次实验中,所有样本数据的排列本身就是随机的,所以可以随意分类测试样本和训练样本

def datingClassTest():
    hoRatio = 0.20     
    character_Mat, label_Mat = readFile('D:/text1.txt')      
    normMat, ranges, min = autoNorm(character_Mat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = knn(normMat[i, :], normMat[numTestVecs:m, :], label_Mat[numTestVecs:m], 3)
        print("训练预测结果: %d, 真实值: %d" % (classifierResult, label_Mat[i]))
        if (classifierResult != label_Mat[i]): errorCount += 1.0
    print("测试样本数量为:",numTestVecs,"\n错误数为: ",errorCount,
            "\n错误率为:" ,(errorCount / float(numTestVecs)))

6b309b011f8c49afbcbad95eeba1f5bc.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在k=3的算法中:60个测试样本中,有6个与预测值有误,错误率为0.1

当把k取10时:60个测试样本中,有8个与预测值有误,错误率为0.133333

53bf3fa2a17f40b8bd5ab09b754405d5.png

k取15时:60个样本中,有10个与预测值有误,错误率为0.1666666

f09d7fd46db9451aba85d4ad1c747a5c.png

把k取20时:60个样本中,有9个与预测值有误,错误率为0.15

1ef75293d989435e893a3a2c1ed57600.png

在多次修改k值并查看测试样本后发现,当k值在(1,6)时,错误率都是0.1,当k值往后继续增大时,错误率始终比0.1大,所以对于我这个数据样本,k值在(1,6)区间是最合适的,k的取值与数据样本间是有很大关联

 

七、算法实现

def classifyPerson():
    resultList = ["很大可能是","很大可能不是"]
    score = float(input("请输入高考分数"))
    library_count = float(input("请输入近15天内进入图书馆次数"))
    game_rate = float(input("游戏时常占比"))
    character_Mat,label_Mat = readFile('D:/text1.txt')
    normMat, ranges, minVals = autoNorm(character_Mat)
    inArr = np.array([score, library_count, game_rate ])
    #先把输入的样本值归一化,再与已经归一化的数据样本比较
    classifierResult = knn((inArr-minVals)/ranges, normMat, label_Mat, 3)
    print("高考成绩 ",score,"\n近15天内进入图书馆次数 ",library_count, "\n游戏时常占比: " ,game_rate, "\n预测结果为: " ,resultList[classifierResult - 1],"集美大学的学生")

看看输入几个新样本,结果如何

2cb027e2927c42409ec856404ae2a19f.png

 aeb51532427d4b7e99cb4b23b4b2daae.png

 

实验总结:

        对于k-近邻算法,k的取值跟样本数据的分布分布情况关联很大,需要多次取不同的k值进行比较,根据错误率来选取合适的k值。

 

 

 

机器学习实战k-邻近算法(kNN)简单实施代码解读 一.概念k-邻近算法是最简单的机器学习算法之一。k-邻近算法采用测量不同特征值之间的距离(具体说是欧氏距离)的方法进行分类。输入待分类的数据后,计算输入特征与样本集数据对应特征的距离,选择样本集中与输入特征距离最小的前k个样本,统计这k个样本数据中出现次数最多的类别作为新数据的分类。二.kNN的简单实施代码及注释from numpy import * import operatordef creat 阅读详情

相关推荐

机器学习笔记九:K近邻算法(KNN)

KNN原理和实战

谢小小XH 7248

机器学习实验:k-近邻算法

1. k-近邻算法的定义k-近邻算法是一种常用的监督学习算法,用于分类和回归任务。它采用测量不同特征值之间的距离方法进行分类,适用于数值型和标称型数据。其优点是精度高、对异常值不敏感、无数据输入假定;缺点是计算复杂度高、空间复杂度高。k-近邻算法(kNN)的工作原理:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。

Gavin_Thomas的博客 1226

K-近邻算法(KNN)原理分析和代码实战

K-近邻算法,全称为K-nearest neighbor,简称KNN。它是一个原理非常简单,但是计算复杂度比较高的一个分类算法,接下来,我们先从原理出发,再进行源代码的解析。

梁先森的博客 1714

【机器学习实验一】k-近邻算法

一、k近邻算法概述 k近邻(k-Nearest Neighbor,简称kNN)算法,是一种应用很广泛的监督学习算法。它非常有效且易于掌握,其工作机制也很简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居"的信息来进行预测。 k近邻算法的算法原理通俗的解释一下:首先有一堆有标签的样本,比如有一个关于鱼的样本集,其中包含有各种不同的鱼,我们知道各种鱼有不同的外貌特征,比如鳞片样式、鱼鳍形状、重量、长度以及鱼的品种;然后给我们一只不...

Joker_Ha_Ha_Ha的博客 4493

【阶段三】Python机器学习10篇:机器学习项目实战:K近邻算法的基本原理、计算步骤与KNN(K近邻)分类模型

Python机器学习10篇:机器学习项目实战:K近邻算法的基本原理、计算步骤与KNN(K近邻)分类模型

张陈亚的博客 541

K近邻算法项目实战:K-Nearest Neighbors (KNN) 实践指南

本文还有配套的精品资源,点击获取 简介:K近邻(KNN)算法是用于分类任务的一个基础且重要的机器学习算法,基于相似样本聚集的原理。本项目实战指南将详细解释KNN的工作原理,探讨使用Python中的 sklearn 库进行KNN实现的过程,以及如何通过实战项目来加深对算法的理解。通过学习,掌握如何计算距离、选择最近邻、决定类别,并了解KNN算法的优势和局限性以及...

weixin_36431814的博客 2005

【机器学习实验一】k近邻算法(KNN)

【机器学习实验一】k近邻算法(KNN) 一、配置环境 ​ 看了很多教程,最终决定安装Anaconda+Pycharm的环境。因为Anaconda中包含了很多库,使用的时候就不用另外手动安装了。而Pycharm作为一款针对Python的编辑器,配置简单,功能强大,使用起来省时省心,对初学者友好,这也是编程验室推荐新手使用Pycharm的原因。 基础安装教程大家可参考:​Python环境的安装(Anaconda+Jupyter notebook+Pycharm) - 知乎 如果大家决定安装Anaconda+Py

qq_47321558的博客 1804

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 238

机器学习实验2——k-近邻算法

k-近邻算法采用测量不同特征值之间的距离方法进行分类,简单来说就是“物以类聚”,计算k个与预测对象距离最近的点,并将出现次数最多的标签最为预测结果。在模型的训练过程中,k值对训练的结果有巨大的影响,k的取值过大会出现欠拟合,k的取值过小会出现过拟合。并且通过此次实验,也能对机器学习有一个大致的概念,明白机器学习的目的与应用,帮助之后对更难的算法的理解。

chill333的博客 870

OAI数据集申请下载全攻略:从个人NDA账号注册到数据包下载的保姆级避坑指南

本文提供OAI数据集申请下载的完整指南,涵盖从个人NDA账号注册到数据包下载的全流程。重点解析login.gov验证陷阱、浏览器兼容性问题、NDA权限申请技巧及nda-tools高效使用方法,帮助医学影像研究者避开常见技术障碍,快速获取全球骨关节炎研究数据库OAI的宝贵数据资源。

weixin_28698059的博客 752

CCS20实战入门:第一个工程搭建示例

通过实际操作演示如何在ccs20中创建并配置首个开发项目,涵盖环境设置与基础调试步骤,帮助新手快速上手ccs20集成开发环境,提升嵌入式开发效率。

weixin_31185473的博客 885

【机器学习实验一】K-近邻算法

1、K-近邻算法原理 k-近邻(k-Nearest Neighbor,kNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 所谓k近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例(也就是上面所说的k个邻居,这k个实例的多数属于某个类,就把该输入实例分类到这个类中。因为是做决策,所以k的取值为单数) 2、K.

一个正在努力学习的iter 938

5G-A无源物联网:深度解析“不插电“智能的底层技术原理

北京移动推出5G-A无源物联网技术,实现电动车标签"零功耗"运行。该技术通过射频能量收集(利用5G-A基站高功率信号转换为电能)和反向散射通信(调制反射信号传输数据)两大核心技术,使设备无需电池即可工作。5G-A相比4G在信号能量密度、通信速率和定位精度等方面显著提升,结合通感一体等创新技术,为无源物联网提供商用基础。该方案已在北京小区试点应用,实现电动车精准定位管理,标签寿命可达5年以上。专家预测,这项技术将大幅降低物联网部署成本,推动"万物智联"时代的到来。

通信行业老兵、物联网从业者,做一个有趣的普通人。 2013

K 近邻算法(KNN)从入门到实战

KNN 是机器学习的 “Hello World” 算法,其核心在于 **“近邻即相似”** 的哲学思想。数据标准化:避免尺度影响。K 值调参:通过交叉验证选择最优值。距离度量:根据数据类型选择合适的距离公式。性能优化:处理大规模数据时使用近似算法。

yu1455256260的博客 1031

【yolo】如何在 YOLOv8 中添加负样本以减少误检

在YOLOv8目标检测中,误检(False Positive)是一个常见问题,即模型将非目标区域错误识别为目标。通过引入负样本(Negative Samples),即不包含任何目标框的图像,可以有效减少误检。在YOLOv8中添加负样本的方法是为这些图像提供空的标注文件(.txt),确保每张图像都有对应的标注文件,即使内容为空。可以使用Python脚本自动生成这些空标注文件。使用负样本时需注意数量比例、标注一致性、验证集同步和图像质量。适当加入负样本能显著提升模型鲁棒性,降低误判风险。

songhuangong123的博客 2879

SAP-ABAP:SAP HANA性能神器FDA:是极速查询的引擎,也是CPU过载的元凶

在SAP S/4HANA的世界里,有一个被ABAP开发者们既爱又怕的特性——Fast Data Access(FDA),它能将性能提升百倍,也能让CPU瞬间飙升。本文将带您全面解剖这一核心机制。

baidu_35680696的博客 849

原理到实战手摸手带你掌握K近邻算法【机器学习入门必备】

前言 k近邻法 (k-nearest neighbor, k-NN) 是一种基本分类与回归方法,是数据挖掘技术中原理最简单的算法之一,核心功能是解决有监督的分类问题。 KNN能够快速高效地解决建立在特殊数据集上的预测分类问题,但其不产生模型。 k近邻法的输入为实例的特征向量,对应与特征空间的点;输出为实例的类别,可以取多类。 k近邻法三个基本要素:k 值的选择、距离度量及分类决策规则。 算法过程 1 计算训练样本和测试样本中每个样本点的距离; 2 对上面所有的距离值进行排序; 3 选前k个最小距离的

hhladminhhl的博客 4510

使用Prophet进行时间序列预测

Prophet是Facebook开发的开源时间序列预测工具,用于处理时间序列数据的建模和预测。它建立在统计模型之上,适用于多种时间序列预测问题,具有易用性和灵活性。能够处理缺失值和异常值支持对节假日和季节性的建模可以灵活地添加自定义的季节性成分自动检测变化点提供了直观的可视化工具这个简短的教程为您提供了使用Prophet进行时间序列预测的基本步骤和一些重要的概念。您可以通过阅读Prophet官方文档和其他在线资源来进一步深入学习和了解更多细节。

Mrrunsen的博客 480

k-近邻算法(KNN)(机器学习理论+python实战)

k-近邻算法(机器学习理论+python实战) 前言 对于其他分类算法:决策树归纳、贝叶斯分类、基于规则的分类、BP-神经网络分类、支持向量机、基于关联规则挖掘的分类,这些都是给定训练集,然后训练得到模型,再去预测新元组(测试集)。 而k-近邻分类不同,它先将训练元组存储,直到给定一个预测元组,它才基于类比学习,即通过给定预测元组与存储的训练元组的相似性,对该元组进行分类。(因此该算法也称为惰性...

万勇's Blog 1636

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Python 机器学习核心入门与实战进阶 Day 2 - KNN(K-近邻算法)分类实战与调参

本文介绍了KNN算法的核心原理与实践应用。KNN是一种基于"以邻为近"思想的懒惰学习算法,通过计算待预测样本与训练集中最近K个样本的距离进行多数投票预测。文章详细讲解了K值选择对模型的影响,并提供了使用sklearn实现KNN分类的完整代码示例,包括数据划分、模型训练、预测评估等步骤。特别强调了通过GridSearchCV进行超参数调优的方法,给出了K值调优的具体实现代码。最后,建议通过学生成绩分类的实践练习巩固所学知识,包括K值比较、可视化分析等环节,并附上了完整的练习脚本和运行结果。

FAN的博客 1160

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python【机器学习实战】K-邻近算法(KNN)

什么是K-邻近算法? K-邻近算法(k-NearestNeighbor)简称KNN,是分类算法中的一种。KNN通过计算新数据与历史样本数据中不同类别数据点间的距离对新数据进行分类。简单来说就是通过与新数据点最邻近的K个数据点来对新数据进行分类和预测。K-邻近分类算法是数据挖掘(classification)技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别。 k-邻近算法工作原理 存在一个样本数据集合,也称作训练样本集,并且样本集合每个数据都存在标签,即我们知道样本集中

qq_51307413的博客 827

k近邻算法_【白话机器学习】算法理论+实战之K近邻算法

1. 写在前面如果想从事数据挖掘或者机器学习的工作,掌握常用的机器学习算法是非常有必要的,在这简单的先捋一捋, 常见的机器学习算法:监督学习算法:逻辑回归,线性回归,决策树,朴素贝叶斯,K近邻,支持向量机,集成算法Adaboost等无监督算法:聚类,降维,关联规则, PageRank等为了详细的理解这些原理,曾经看过西瓜书,统计学习方法,机器学习实战等书,也听过一些机器学习的课程,但总感...

weixin_39736606的博客 583

Python KNN k-邻近算法 手动实现及分析 分类、回归、糖尿病预测实战

Python KNN k-邻近算法 算法原理 \qquad k-邻近算法的核心思想是未标记样本的类别,由距离其最近的k个邻近投票来决定。 \qquad 假设,我们有一个已经标记的数据集,即已经知道了数据集中每个样本所属的类别。此外,有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。k-邻近算法的原理是,计算待标记的数据样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的数据...

Rp的博客 2863

模式识别和机器学习实战-K近邻算法(KNN)- Python实现 - 约会网站配对效果判断和手写数字识别

文章目录前言一、 k-近邻算法的Python实现1.**工作原理**2.举个简单例子:3.步骤描述来了——代码实现总结 前言 K-近邻算法(k-Nearest Neighbor algorithm),又称为KNN算法,是数据挖掘技术中最简单的方法 一、 k-近邻算法的Python实现 1.工作原理 存在一个样本的数据集合,也称作训练样本集,样本集中每个数据存在标签,输入没有标签的新数据以后,将新数据的每个特征与样本集中的数据特征进行比较,找到与新数据最近邻的k个实例,如果这k个实例多属于某个类别新数据就属

LeoEdwin的博客 5359

【P16 机器学习-分类算法及应用实践】KNN算法(分类思想、KNN算法原理、最近邻算法 、K近邻算法思想、KNN算法步骤、KNN算法实战、KNN算法优点/缺点总结)

本文介绍了KNN(K-最近邻)分类算法的基本原理与应用实践。KNN是一种基于相似度的分类方法,其核心思想是"物以类聚"。文章首先通过电影分类示例(爱情片/动作片)直观展示分类概念,随后详细阐述了KNN算法步骤:1)计算待分类样本与训练集样本的距离;2)选取距离最近的K个邻居;3)根据邻居类别投票确定分类结果。重点讨论了K值选择对分类效果的影响,并通过Python代码逐步实现KNN算法,包括距离计算、排序、投票统计等关键步骤。最后给出了完整程序实现,展示了如何通过KNN对未知电影类型进行分

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1131
上一篇: 用Python3 深入理解《机器学习实战》中k-近邻算法中海伦约会网站配对的案例
下一篇: 机器学习决策树
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值