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中元祖、列表和字典的区别
Aug 17 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 Python
浅谈python的输入输出,注释,基本数据类型
Apr 02 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Python装饰器用法与知识点小结
Mar 09 Python
PyTorch中的C++扩展实现
Apr 02 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
Python 字典一个键对应多个值的方法
Sep 29 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
手把手教你实现PyTorch的MNIST数据集
Jun 28 Python
利用python进行数据加载
Jun 20 #Python
Python编解码问题及文本文件处理方法详解
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
python自动计算图像数据集的RGB均值
详解如何用Python实现感知器算法
You might like
mysql 中InnoDB和MyISAM的区别分析小结
2008/04/15 PHP
PHP错误Cannot use object of type stdClass as array in错误的解决办法
2014/06/12 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
php基于Redis消息队列实现的消息推送的方法
2018/11/28 PHP
利用javascript/jquery对上传文件格式过滤的方法
2009/07/25 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
js+css实现有立体感的按钮式文字竖排菜单效果
2015/09/01 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
jquery实现点击页面回到顶部
2016/11/23 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
js实现GIF图片的分解和合成
2019/10/24 Javascript
javascript中的相等操作符(==与===区别)
2019/12/21 Javascript
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
Python正则获取、过滤或者替换HTML标签的方法
2016/01/28 Python
Python使用wget实现下载网络文件功能示例
2018/05/31 Python
pandas 选择某几列的方法
2018/07/03 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
使用Django和Postgres进行全文搜索的实例代码
2020/02/13 Python
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
大学生求职自我评价
2014/01/16 职场文书
数字化校园建设方案
2014/05/03 职场文书
外联部演讲稿
2014/05/24 职场文书
物流管理专业求职信
2014/05/29 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2015年政风行风工作总结
2015/04/21 职场文书
六五普法先进个人主要事迹材料
2015/11/03 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
python中的sys模块和os模块
2022/03/20 Python
Nginx图片服务器配置之后图片访问404的问题解决
2022/03/21 Servers