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回调函数的使用方法
Jan 23 Python
Python判断变量是否为Json格式的字符串示例
May 03 Python
python使用 HTMLTestRunner.py生成测试报告
Oct 20 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python+OpenCV实现车牌字符分割和识别
Mar 31 Python
python logging日志模块以及多进程日志详解
Apr 18 Python
对Pandas MultiIndex(多重索引)详解
Nov 16 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 Python
Django Admin设置应用程序及模型顺序方法详解
Apr 01 Python
python 无损批量压缩图片(支持保留图片信息)的示例
Sep 22 Python
pandas求平均数和中位数的方法实例
Aug 04 Python
利用python进行数据加载
Jun 20 #Python
Python编解码问题及文本文件处理方法详解
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
python自动计算图像数据集的RGB均值
详解如何用Python实现感知器算法
You might like
不用数据库的多用户文件自由上传投票系统(2)
2006/10/09 PHP
使用PHP遍历文件夹与子目录的函数代码
2011/09/26 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
js 获取服务器控件值的代码
2010/03/05 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
JavaScript定时显示广告代码分享
2015/03/02 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
微信小程序中多个页面传参通信的学习与实践
2017/05/05 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
详解Eslint 配置及规则说明
2018/09/10 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
JS实现transform实现扇子效果
2020/01/17 Javascript
vue输入框使用模糊搜索功能的实现代码
2020/05/26 Javascript
如何在Vue项目中添加接口监听遮罩
2021/01/25 Vue.js
python实现的简单猜数字游戏
2015/04/04 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Python入门Anaconda和Pycharm的安装和配置详解
2019/07/16 Python
使用python写的opencv实时监测和解析二维码和条形码
2019/08/14 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
2020/04/02 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
Django web自定义通用权限控制实现方法
2020/11/24 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
Swanson中国官网:美国斯旺森健康产品公司
2021/03/01 全球购物
办理居住证介绍信
2014/01/15 职场文书
同志主要表现材料
2014/08/21 职场文书
优秀党员学习焦裕禄精神思想汇报范文
2014/09/10 职场文书
2014年会计人员工作总结
2014/12/10 职场文书
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python
SQL Server中的游标介绍
2022/05/20 SQL Server