Python机器学习之底层实现KNN


Posted in Python onJune 20, 2021

一、导入数据

借助python自带的pandas库导入数据,很简单。用的数据是下载到本地的红酒集。

代码如下(示例):

import pandas as pd
def read_xlsx(csv_path):
    data = pd.read_csv(csv_path)
    print(data)
    return data

二、归一化

KNN算法中将用到距离,因此归一化是一个重要步骤,可以消除数据的量纲。我用了归一化,消除量纲也可以用标准化,但是作为新手,我觉得归一化比较简单。

其中最大最小值的计算用到了python中的numpy库,pandas导入的数据是DateFrame形式的,np.array()用来将DateFrame形式转化为可以用numpy计算的ndarray形式。

代码如下(示例):

import numpy as np
def MinMaxScaler(data):
    col = data.shape[1]
    for i in range(0, col-1):
        arr = data.iloc[:, i]
        arr = np.array(arr) #将DataFrame形式转化为ndarray形式,方便后续用numpy计算
        min = np.min(arr)
        max = np.max(arr)
        arr = (arr-min)/(max-min)
        data.iloc[:, i] = arr
    return data

三、分训练集和测试集

先将数据值和标签值分别用x和y划分开,设置随机数种子random_state,若不设置,则每次运行的结果会不相同。test_size表示测试集比例。

def train_test_split(data, test_size=0.2, random_state=None):
    col = data.shape[1]
    x = data.iloc[:, 0:col-1]
    y = data.iloc[:, -1]
    x = np.array(x)
    y = np.array(y)
    # 设置随机种子,当随机种子非空时,将锁定随机数
    if random_state:
        np.random.seed(random_state)
        # 将样本集的索引值进行随机打乱
        # permutation随机生成0-len(data)随机序列
    shuffle_indexs = np.random.permutation(len(x))
    # 提取位于样本集中20%的那个索引值
    test_size = int(len(x) * test_size)
    # 将随机打乱的20%的索引值赋值给测试索引
    test_indexs = shuffle_indexs[:test_size]
    # 将随机打乱的80%的索引值赋值给训练索引
    train_indexs = shuffle_indexs[test_size:]
    # 根据索引提取训练集和测试集
    x_train = x[train_indexs]
    y_train = y[train_indexs]
    x_test = x[test_indexs]
    y_test = y[test_indexs]
    # 将切分好的数据集返回出去
    # print(y_train)
    return x_train, x_test, y_train, y_test

四、计算距离

此处用到欧氏距离,pow()函数用来计算幂次方。length指属性值数量,在计算最近邻时用到。

def CountDistance(train,test,length):
    distance = 0
    for x in range(length):
        distance += pow(test[x] - train[x], 2)**0.5
    return distance

五、选择最近邻

计算测试集中的一条数据和训练集中的每一条数据的距离,选择距离最近的k个,以少数服从多数原则得出标签值。其中argsort返回的是数值从小到大的索引值,为了找到对应的标签值。

tip:用numpy计算众数的方法

import numpy as np
#bincount():统计非负整数的个数,不能统计浮点数
counts = np.bincount(nums)
#返回众数
np.argmax(counts)

少数服从多数原则,计算众数,返回标签值。

def getNeighbor(x_train,test,y_train,k):
    distance = []
    #测试集的维度
    length = x_train.shape[1]
    #测试集合所有训练集的距离
    for x in range(x_train.shape[0]):
        dist = CountDistance(test, x_train[x], length)
        distance.append(dist)
    distance = np.array(distance)
    #排序
    distanceSort = distance.argsort()
    # distance.sort(key= operator.itemgetter(1))
    # print(len(distance))
    # print(distanceSort[0])
    neighbors =[]
    for x in range(k):
        labels = y_train[distanceSort[x]]
        neighbors.append(labels)
        # print(labels)
    counts = np.bincount(neighbors)
    label = np.argmax(counts)
    # print(label)
    return label

调用函数时:

getNeighbor(x_train,x_test[0],y_train,3)

六、计算准确率

用以上KNN算法预测测试集中每一条数据的标签值,存入result数组,将预测结果与真实值比较,计算预测正确的个数与总体个数的比值,即为准确率。

def getAccuracy(x_test,x_train,y_train,y_test):
    result = []
    k = 3
    # arr_label = getNeighbor(x_train, x_test[0], y_train, k)
    for x in range(len(x_test)):
        arr_label = getNeighbor(x_train, x_test[x], y_train, k)
        result.append(arr_label)
    correct = 0
    for x in range(len(y_test)):
        if result[x] == y_test[x]:
           correct += 1
    # print(correct)
    accuracy = (correct / float(len(y_test))) * 100.0
    print("Accuracy:", accuracy, "%")
    return accuracy

总结

KNN算是机器学习中最简单的算法,实现起来相对简单,但对于我这样的新手,还是花费了大半天时间才整出来。

在github上传了项目:https://github.com/chenyi369/KNN

到此这篇关于Python机器学习之底层实现KNN的文章就介绍到这了,更多相关Python底层实现KNN内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
详解Python中for循环是如何工作的
Jun 30 Python
Python编程实现正则删除命令功能
Aug 30 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
python自动查询12306余票并发送邮箱提醒脚本
May 21 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
Jun 26 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
python 根据字典的键值进行排序的方法
Jul 24 Python
python修改字典键(key)的方法
Aug 05 Python
wxPython色环电阻计算器
Nov 18 Python
Python闭包的定义和使用方法
Apr 11 Python
利用python进行数据加载
Jun 20 #Python
Python编解码问题及文本文件处理方法详解
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
python自动计算图像数据集的RGB均值
详解如何用Python实现感知器算法
You might like
多重?l件?合查?(一)
2006/10/09 PHP
留言板翻页的实现详解
2006/10/09 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
在javascript中随机数 math random如何生成指定范围数值的随机数
2015/10/21 Javascript
JavaScript中Window对象的属性及事件
2015/12/25 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
js仿百度切换皮肤功能(html+css)
2016/07/10 Javascript
vue-cli项目如何使用vue-resource获取本地的json数据(模拟服务端返回数据)
2017/08/04 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
vuejs使用axios异步访问时用get和post的实例讲解
2018/08/09 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
2019/05/10 Javascript
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
vue项目配置同一局域网可使用ip访问的操作
2020/10/23 Javascript
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
Django项目中model的数据处理以及页面交互方法
2018/05/30 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
Python I/O与进程的详细讲解
2019/03/08 Python
python实践项目之监控当前联网状态详情
2019/05/23 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
快速解决jupyter启动卡死的问题
2020/04/10 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
html5实现多图片预览上传及点击可拖拽控件
2018/03/15 HTML / CSS
悬挂训练绳:TRX
2017/12/14 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
MySQL面试题
2014/01/12 面试题
公司活动邀请函
2014/01/24 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书