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在校内发人人网状态(人人网看状态)
Feb 19 Python
仅用500行Python代码实现一个英文解析器的教程
Apr 02 Python
python利用MethodType绑定方法到类示例代码
Aug 27 Python
详解python异步编程之asyncio(百万并发)
Jul 07 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
python安装numpy和pandas的方法步骤
May 27 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
Pycharm+django2.2+python3.6+MySQL实现简单的考试报名系统
Sep 05 Python
python:动态路由的Flask程序代码
Nov 22 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 Python
python闭包与引用以及需要注意的陷阱
Sep 18 Python
python中的插入排序的简单用法
Jan 19 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中iconv函数使用方法
2008/05/24 PHP
PHP中Fatal error session_start()错误解决步骤
2014/08/05 PHP
MyEclipse常用配置图文教程
2014/09/11 PHP
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
php使用指定字符列表生成随机字符串的方法
2015/04/18 PHP
php中实现进程锁与多进程的方法
2016/09/18 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
javascript document.images实例
2008/05/27 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
防止按钮在短时间内被多次点击的方法
2014/03/10 Javascript
jQuery实现简单的点赞效果
2020/05/29 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
vue 获取视频时长的实例代码
2019/08/20 Javascript
layui的select联动实现代码
2019/09/28 Javascript
跟老齐学Python之大话题小函数(1)
2014/10/10 Python
Python字符串替换实例分析
2015/05/11 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
浅谈django model的get和filter方法的区别(必看篇)
2017/05/23 Python
使用XML库的方式,实现RPC通信的方法(推荐)
2017/06/14 Python
python将字符串转换成json的方法小结
2019/07/09 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
html svg生成环形进度条的实现方法
2019/09/23 HTML / CSS
马来西亚时装购物网站:ZALORA马来西亚
2017/03/14 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
工商企业管理应届生求职信
2013/11/03 职场文书
承认错误的检讨书
2014/01/30 职场文书
授权委托书格式范文
2014/08/02 职场文书
村创先争优活动总结
2014/08/28 职场文书
带香烟到学校抽的检讨书
2014/09/25 职场文书
承租经营合作者协议书
2014/10/01 职场文书
清洁工个人总结
2015/03/04 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
解析目标检测之IoU
2021/06/26 Python