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正则匹配查询港澳通行证办理进度示例分享
Dec 27 Python
Python的函数嵌套的使用方法
Jan 24 Python
在Windows8上的搭建Python和Django环境
Jul 03 Python
python中字符串类型json操作的注意事项
May 02 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
idea创建springMVC框架和配置小文件的教程图解
Sep 18 Python
python+opencv 读取文件夹下的所有图像并批量保存ROI的方法
Jan 10 Python
Numpy数组array和矩阵matrix转换方法
Aug 05 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
解决python中0x80072ee2错误的方法
Jul 19 Python
属性与 @property 方法让你的python更高效
Sep 21 Python
利用Python批量识别电子账单数据的方法
Feb 08 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 adodb操作mysql数据库
2009/03/19 PHP
PHP5权威编程阅读学习笔记 附电子书下载
2012/07/05 PHP
解密ThinkPHP3.1.2版本之模块和操作映射
2014/06/19 PHP
php导出csv文件,可导出前导0实例代码
2016/11/16 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
CSS+Table图文混排中实现文本自适应图片宽度(超简单+跨所有浏览器)
2009/02/14 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
jquery实现滑动特效代码
2015/08/10 Javascript
JS实现可点击展开与关闭的左侧广告代码
2015/09/02 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
jQuery绑定事件-多种实现方式总结
2016/05/09 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
HTML5开发Kinect体感游戏的实例应用
2017/09/18 Javascript
vue组件之Alert的实现代码
2017/10/17 Javascript
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
举例讲解Python中装饰器的用法
2015/04/27 Python
使用python调用zxing库生成二维码图片详解
2017/01/10 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
详谈Python3 操作系统与路径 模块(os / os.path / pathlib)
2018/04/26 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
python Event事件、进程池与线程池、协程解析
2019/10/25 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
python3中TQDM库安装及使用详解
2020/11/18 Python
html5 乒乓球(碰撞检测)实例二
2013/07/25 HTML / CSS
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
美国手机支架公司:PopSockets
2019/11/27 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
毕业自我评价范文
2013/11/17 职场文书
2015年售后服务工作总结
2015/04/25 职场文书
班级班风口号大全
2015/12/25 职场文书
超级实用的公文标题大全!
2019/07/19 职场文书
Win11局域网共享权限在哪里设置? Win11高级共享的设置技巧
2022/04/05 数码科技
MYSQL中文乱码问题的解决方案
2022/06/14 MySQL