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使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python判断文本中消息重复次数的方法
Apr 27 Python
Python实现PS滤镜中马赛克效果示例
Jan 20 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
Python基础知识点 初识Python.md
May 14 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
TensorFlow内存管理bfc算法实例
Feb 03 Python
浅谈Python3多线程之间的执行顺序问题
May 02 Python
浅析Python中字符串的intern机制
Oct 03 Python
python实现经纬度采样的示例代码
Dec 10 Python
Django实现翻页的示例代码
May 24 Python
Python pyecharts绘制条形图详解
Apr 02 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(3)
2006/10/09 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
javascript里的条件判断
2007/02/27 Javascript
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
2017/11/14 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
通过数据库向Django模型添加字段的示例
2015/07/21 Python
Python处理JSON数据并生成条形图
2016/08/05 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
python pygame实现方向键控制小球
2019/05/17 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
python针对mysql数据库的连接、查询、更新、删除操作示例
2019/09/11 Python
DataFrame.to_excel多次写入不同Sheet的实例
2019/12/02 Python
python多进程 主进程和子进程间共享和不共享全局变量实例
2020/04/25 Python
matplotlib基础绘图命令之bar的使用方法
2020/08/13 Python
html5开发之viewport使用
2013/10/17 HTML / CSS
html5调用app分享功能示例(WebViewJavascriptBridge)
2018/03/21 HTML / CSS
导游实习生自荐书
2014/01/28 职场文书
中学生自我评价范文
2014/02/08 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
2015年销售内勤工作总结
2015/04/27 职场文书
2016教师学习教育法心得体会
2016/01/19 职场文书