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统计日志中每个IP出现次数的方法
Jul 06 Python
Python使用poplib模块和smtplib模块收发电子邮件的教程
Jul 02 Python
关于Python 3中print函数的换行详解
Aug 08 Python
Python实现的双色球生成功能示例
Dec 18 Python
Python3多进程 multiprocessing 模块实例详解
Jun 11 Python
浅谈python下含中文字符串正则表达式的编码问题
Dec 07 Python
python自定义线程池控制线程数量的示例
Feb 22 Python
Django中在xadmin中集成DjangoUeditor过程详解
Jul 24 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python confluent kafka客户端配置kerberos认证流程详解
Oct 12 Python
pytorch简介
Nov 11 Python
Pycharm在指定目录下生成文件和删除文件的实现
Dec 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
基于php缓存的详解
2013/05/15 PHP
php获取一个变量的名字的方法
2014/09/05 PHP
thinkPHP+PHPExcel实现读取文件日期的方法(含时分秒)
2016/07/07 PHP
php获取数据库中数据的实现方法
2017/06/01 PHP
JS学习之一个简易的日历控件
2010/03/24 Javascript
使用apply方法处理数组的三个技巧[译]
2012/09/20 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
node模块机制与异步处理详解
2016/03/13 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
Vue拖拽组件列表实现动态页面配置功能
2019/06/17 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
python修改操作系统时间的方法
2015/05/18 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
Android分包MultiDex策略详解
2017/10/30 Python
浅谈tensorflow中几个随机函数的用法
2018/07/27 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python for循环通过序列索引迭代过程解析
2020/02/07 Python
django ORM之values和annotate使用详解
2020/05/19 Python
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
html5构建触屏网站之网站尺寸探讨
2013/01/07 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
小学生评语集锦
2014/04/18 职场文书
股东授权委托书范本
2014/09/13 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
工作失职检讨书(精华篇)
2014/10/15 职场文书
介绍信格式样本
2015/05/05 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL