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实现socket端口重定向示例
Feb 10 Python
Pipenv一键搭建python虚拟环境的方法
May 22 Python
Python基于property实现类的特性操作示例
Jun 15 Python
python requests 库请求带有文件参数的接口实例
Jan 03 Python
python 调用钉钉机器人的方法
Feb 20 Python
python实现文件批量编码转换及注意事项
Oct 14 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python类的动态绑定实现原理
Mar 21 Python
如何通过Python3和ssl实现加密通信功能
May 09 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 Python
Python干货实战之八音符酱小游戏全过程详解
Oct 24 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/05/12 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
JavaScript的Cookies
2008/01/16 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
AngularJS自动表单验证
2016/02/01 Javascript
js实现方块上下左右移动效果
2017/08/17 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
JS document内容及样式操作完整示例
2020/01/14 Javascript
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
python使用turtle库绘制时钟
2020/03/25 Python
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
在Mac中PyCharm配置python Anaconda环境过程图解
2020/03/11 Python
零基础小白多久能学会python
2020/06/22 Python
Python使用jpype模块调用jar包过程解析
2020/07/29 Python
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
C#如何进行LDAP用户校验
2012/11/21 面试题
党员年终民主评议的自我评价
2013/11/05 职场文书
物业管理毕业生个人的求职信
2013/11/30 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
2014年双拥工作总结
2014/11/21 职场文书
交通事故调解协议书
2015/05/20 职场文书
社区志愿服务活动感想
2015/08/07 职场文书
先进基层党组织主要事迹材料
2015/11/03 职场文书
2016中秋节问候语
2015/11/11 职场文书
《正面管教》读后有感:和善而坚定的旅程
2019/12/19 职场文书
js实现模拟购物商城案例
2021/05/18 Javascript
使用nginx配置访问wgcloud的方法
2021/06/26 Servers