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 相关文章推荐
TensorFlow变量管理详解
Mar 10 Python
python 编码规范整理
May 05 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
python实现RabbitMQ的消息队列的示例代码
Nov 08 Python
详解django自定义中间件处理
Nov 21 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
Python线上环境使用日志的及配置文件
Jul 28 Python
Python使用itchat 功能分析微信好友性别和位置
Aug 05 Python
Python统计分析模块statistics用法示例
Sep 06 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
Python打印特殊符号及对应编码解析
May 07 Python
基于Python和openCV实现图像的全景拼接详细步骤
Oct 05 Python
利用python进行数据加载
Jun 20 #Python
Python编解码问题及文本文件处理方法详解
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
python自动计算图像数据集的RGB均值
详解如何用Python实现感知器算法
You might like
php中的三元运算符使用说明
2011/07/03 PHP
php中动态修改ini配置
2014/10/14 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
基于php编程规范(详解)
2017/08/17 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
深入分析原生JavaScript事件
2014/12/29 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
2015/08/21 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
javascript 组合按键事件监听实现代码
2017/02/21 Javascript
jquery事件与绑定事件
2017/03/16 Javascript
javascript中new Array()和var arr=[]用法区别
2017/12/01 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
BootStrap前端框架使用方法详解
2020/02/26 Javascript
webpack+express实现文件精确缓存的示例代码
2020/06/11 Javascript
JavaScript中数组去重的5种方法
2020/07/04 Javascript
Python三元运算实现方法
2015/01/12 Python
Python中endswith()函数的基本使用
2015/04/07 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python+Socket实现基于TCP协议的客户与服务端中文自动回复聊天功能示例
2017/08/31 Python
Python向excel中写入数据的方法
2019/05/05 Python
关于PyTorch源码解读之torchvision.models
2019/08/17 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
python梯度下降算法的实现
2020/02/24 Python
Python实现检测文件的MD5值来查找重复文件案例
2020/03/12 Python
keras model.fit 解决validation_spilt=num 的问题
2020/06/19 Python
文史专业毕业生自荐信
2013/11/17 职场文书
生产总经理岗位职责
2013/12/19 职场文书
儿子婚宴答谢词
2014/01/09 职场文书
致裁判员加油稿
2014/02/08 职场文书
岗位职责说明书
2014/05/07 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书