首页 > 编程语言 >knn算法的实现

knn算法的实现

时间:2024-04-20 13:34:48浏览次数:25  
标签:knn distance sortIndex 实现 feature label 算法 np

    目录

1.概念

2.代码实战

3.关于如何解决预测不准

    3.1)调整k的值会影响预测值

    3.2)增加数据的维度

4.空间和维度

    4.1一维空间

    4.2二维空间

    4.3三维空间

    4.4空间中两点距离的计算

5.精度问题之数据归一化处理



 

 

1.概念

     KNN(K-Nearest Neighbor)最邻近分类算法是数据挖掘分类技术中最简单的算法之一,其指导思想是”近朱者赤,近墨者黑“,即由你的邻居来推断出你的类别。

     实现原理:为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。

                                     

 

2.代码实战

import numpy as np
import collections as c

data = np.array([
    [154, 1],
    [126, 2],
    [70, 2],
    [196, 2],
    [161, 2],
    [371, 4]
])
# 输入值
feature = data[:, 0]
# 结果
label = data[:, -1]#用-1,因为前面可以有很多列特征值,-1可以直接输出最后一列的label值
# 预测点
predictPoint = 300
# 计算每个投掷点距离预测点的距离
distance = list(map(lambda x: abs(predictPoint-x), feature))
print(distance)
# 对distance的集合元素从小到大排序(返回的是下标)
sortIndex = np.argsort(distance)
# 用排序的sortIndex来操作label集合
sortedLabel = label[sortIndex]
# knn算法的k取最近的三个邻居
k = 3
print(c.Counter(sortedLabel[0:k]).most_common(1)[0][0])

 

 

3.关于如何解决预测不准

  

 

 

            3.1)调整k的值会影响预测值

                     

# 处理数据, 把数据打散, 分成训练集和测试集
import numpy as np

data = np.loadtxt("knn_data0.csv", delimiter=",")
np.random.shuffle(data)

testData = data[0:100]
trainData = data[100:-1]

# 保存测试数据
np.savetxt("knn_testdata0.csv", testData, delimiter=",", fmt="%d")
# 保存训练数据
np.savetxt("knn_traindata0.csv", trainData, delimiter=",", fmt="%d")
import numpy as np
import collections as c

def knn(k, predictPoint, feature, label):
    distance = list(map(lambda x: abs(predictPoint - x), feature))
    # 对distance的集合元素从小到大排序(返回的是下标)
    sortIndex = np.argsort(distance)
    # 用排序的sortIndex来操作label集合
    sortedLabel = label[sortIndex]
    # knn算法的k取最近的三个邻居
    return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]
if __name__=='__main__':
    traindata = np.loadtxt("knn_traindata0.csv", delimiter=",")
    # 输入值
    feature = traindata[:, 0]
    # 结果值
    label = traindata[:, -1]
    # 预测点,来自测试数据集的每一条记录
    testdata = np.loadtxt("knn_testdata0.csv", delimiter=",")
    for k in range(1, 100):
        count = 0
        for item in testdata:
            predict = knn(k, item[0], feature, label)
            real = item[1]
            if predict == real:
                count += 1
        print("k={},准确率:{}%".format(k, count*100.0/len(testdata)))

 

 

            3.2)增加数据的维度

                     

 

 

                      原数据集如下图所示:

                      

 

                   将其中的中文颜色转化为数字弹性:

import numpy as np

def color_to_num(str):
    dict = {"红": 0.50, "黄": 0.51, "蓝": 0.52, "绿": 0.53, "紫": 0.54, "粉": 0.55}
    return dict[str]

data = np.loadtxt("knn_data1.csv", delimiter=",", converters={1: color_to_num}, encoding="gbk")
print(data)

 

 

4.空间和维度

          4.1) 一维空间

               

 

           4.2) 二维空间

         

 

           

       4.3) 三维空间

                 

 

 

 

 

       4.4) 空间中两点距离的计算

            

 

 

                      例:代码对比

 

# 一维空间
def knn(k, predictPoint, feature, label):
    distance = list(map(lambda x: abs(predictPoint - x), feature))
    # 对distance的集合元素从小到大排序(返回的是下标)
    sortIndex = np.argsort(distance)
    # 用排序的sortIndex来操作label集合
    sortedLabel = label[sortIndex]
    # knn算法的k取最近的三个邻居
    return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]
# 二维空间
def knn2(k, predictPoint, ballColor, feature, label):
    distance = list(map(lambda item: ((item[0]-predictPoint)**2+(item[1]-ballColor)**2)**0.5, feature))
    sortIndex = np.argsort(distance)
    sortedLabel = label[sortIndex]
    return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]

 

 

5.精度问题之 数据归一化处理

                   

 

                   

 

# 数据归一化处理后
def knn3(k, predictPoint, ballColor, feature, label):
    distance = list(map(lambda item: ((item[0]/475-predictPoint/475)**2+((item[1]-0.50)/0.05-(ballColor-0.50)/0.05)**2)**0.5, feature))
    sortIndex = np.argsort(distance)
    sortedLabel = label[sortIndex]
    return c.Counter(sortedLabel[0:k]).most_common(1)[0][0]

 

标签:knn,distance,sortIndex,实现,feature,label,算法,np
From: https://www.cnblogs.com/ztzzh-1/p/18147613

相关文章

  • 数据结构与算法学习(1)——DFS(深度优先搜索)
    DFS基础深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发......
  • 如何在EF Core中实现悲观锁
    问题描述在高流量场景下,绝对需要确保一次只有一个进程可以修改一块数据。假设你正在为一个极其受欢迎的音乐会构建售票系统。顾客们热切地抢购门票,最后几张票可能同时被售出。如果你不小心,多个顾客可能认为他们已经确保了最后的座位,导致超售!EntityFrameworkCore是一个好工具,但......
  • 基环树算法总结
    基环树算法总结一、什么是基环树基环树,顾名思义,有两个要素:环和树。因此,基环树就是一棵树的一个节点,扩成一个环,做题时,多棵基环树组成的基环树森林,常以如下方式出现:每个点只有一个出边。每个点只有一个入边。图中一共有\(n\)个点,\(n\)条边。那么,基环树类型的题目应该怎......
  • Python量化交易系统实战_实现股票实盘交易
    作者:麦克煎蛋  出处:https://www.cnblogs.com/mazhiyong/转载请保留这段声明,谢谢!这里以EasyTrader为例,感受下如何实现程序化交易。一、EasyTrader技术原理简介EasyTrader主要原理是利用pywinauto自动获取同花顺上相应控件的值,进行模拟自动化的操作,它给散户提供了一个强大......
  • 短视频直播系统,实现高并发秒杀的多种方式
    方式一(改进版加锁)@ApiOperation(value="秒杀实现方式——Lock加锁")@PostMapping("/start/lock")publicResultstartLock(longskgId){//在此处加锁lock.lock();try{log.info("开始秒杀方式一...");finallonguserId=(int)(ne......
  • 前端使用 Konva 实现可视化设计器(6)
    请大家动动小手,给我一个免费的Star吧~这一章处理一下复制、粘贴、删除、画布归位、层次调整,通过右键菜单控制。github源码gitee源码示例地址复制粘贴复制粘贴(通过快捷键)//复制暂存pasteCache:Konva.Node[]=[];//粘贴次数(用于定义新节点的偏移距离)past......
  • 使用float,flex和tailwind实现同一个表单注册效果
    float方式html结构<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</titl......
  • FineReport11 报表技巧02- 实现类Excel表头筛选功能
    背景:在报表开发中,有的需求方用习惯Excel的表头筛选时,就不太习惯帆软的特意点击报表控件进行筛选,希望报表筛选方式可以类似Excel那种直接在表头进行筛选的功能最终效果如下:实现步骤:1.1、数据集准备产品信息表:SELECT客户,产品,数量,cast(下单时间asdate)as下单时间,下单......
  • 31天【代码随想录算法训练营34期】第八章 贪心算法 part01(● 理论基础 ● 455.分发
    贪心算法就是先选局部最优,再推全局最优没有套路将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解●455.分发饼干classSolution:deffindContentChildren(self,g:List[int],s:List[int])->int:g.s......
  • 人间算法题:到底是不是一个环?
    很多人都说人生就是一个循环,每天重复重复。而所谓环,对于写代码的小伙伴来说是有特殊定义的。我的理解就是节点循环,就成了环。刚好刷到一个掘金好友分享的腾讯一面算法题:判断一个单链表是不是一个环。其实有很多办法来实现,但是我更喜欢用快慢指针来判断环的形成。思路如下:定义......