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脚本在Appium库上对移动应用实现自动化测试
Apr 17 Python
python使用multiprocessing模块实现带回调函数的异步调用方法
Apr 18 Python
Python的Django中django-userena组件的简单使用教程
May 30 Python
Python中的下划线详解
Jun 24 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
Python中常用的内置方法
Jan 28 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
在python3中实现更新界面
Feb 21 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
Python 中的Sympy详细使用
Aug 07 Python
Python requests用法和django后台处理详解
Mar 19 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获取音频文件的相关信息
2015/06/22 PHP
Yii Framework框架使用PHPExcel组件的方法示例
2019/07/24 PHP
JavaScript开发时的五个注意事项
2007/12/08 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
保证JavaScript和Asp、Php等后端程序间传值编码统一
2009/04/17 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
asp.net中System.Timers.Timer的使用方法
2013/03/20 Javascript
javascript读取Xml文件做一个二级联动菜单示例
2014/03/17 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
JavaScript实现的MD5算法完整实例
2016/02/02 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
jQuery实现checkbox列表的全选、反选功能
2016/11/24 Javascript
数组Array的一些方法(总结)
2017/02/17 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
JavaScript实现表单验证功能
2020/12/09 Javascript
[02:16]深扒TI7聊天轮盘语音出处2
2017/05/11 DOTA
python逐行读取文件内容的三种方法
2014/01/20 Python
python分析作业提交情况
2017/11/22 Python
Python3读取Excel数据存入MySQL的方法
2018/05/04 Python
对Python Pexpect 模块的使用说明详解
2019/02/14 Python
Python使用Pandas库实现MySQL数据库的读写
2019/07/06 Python
大专生简历的自我评价
2013/11/26 职场文书
预备党员政审材料
2014/02/04 职场文书
物理系毕业生自荐书
2014/06/13 职场文书
国际语言毕业生求职信
2014/07/08 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
团支部书记竞选稿
2015/11/21 职场文书
Pytorch distributed 多卡并行载入模型操作
2021/06/05 Python
Python的property属性详细讲解
2022/04/11 Python