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之用while来循环
Oct 02 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
简单谈谈python中的语句和语法
Aug 10 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
手把手教你python实现SVM算法
Dec 27 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
Python使用pickle模块储存对象操作示例
Aug 15 Python
Python实现的栈、队列、文件目录遍历操作示例
May 06 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
numpy.transpose()实现数组的转置例子
Dec 02 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
利用python进行数据加载
Jun 20 #Python
Python编解码问题及文本文件处理方法详解
浅谈Python协程asyncio
Jun 20 #Python
Python3接口性能测试实例代码
Jun 20 #Python
使用Djongo模块在Django中使用MongoDB数据库
python自动计算图像数据集的RGB均值
详解如何用Python实现感知器算法
You might like
Protoss兵种介绍
2020/03/14 星际争霸
基于empty函数的输出详解
2013/06/17 PHP
php更新修改excel中的内容实例代码
2014/02/26 PHP
php编程每天必学之验证码
2016/03/03 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
js的event详解。
2006/09/06 Javascript
Javascript的并行运算实现代码
2010/11/19 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
2013/01/04 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
JavaScript实现找质数代码分享
2015/03/24 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
纯JS前端实现分页代码
2016/06/21 Javascript
KnockoutJS 3.X API 第四章之表单submit、enable、disable绑定
2016/10/10 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
AngularJS extend用法详解及实例代码
2016/11/15 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
jQuery选择器中的特殊符号处理方法
2017/09/08 jQuery
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
详解小程序设置缓存并且不覆盖原有数据
2019/04/15 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
对Python新手编程过程中如何规避一些常见问题的建议
2015/04/01 Python
python pandas 对series和dataframe的重置索引reindex方法
2018/06/07 Python
python requests证书问题解决
2019/09/05 Python
Python实现钉钉订阅消息功能
2020/01/14 Python
python如何求圆的面积
2020/07/01 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
医学院毕业生自荐信
2013/11/08 职场文书
党员个人对照检查材料思想汇报
2014/09/16 职场文书
电影地道战观后感
2015/06/04 职场文书
宾馆卫生管理制度
2015/08/06 职场文书
MySQL系列之二 多实例配置
2021/07/02 MySQL