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中urllib2模块的8个使用细节分享
Jan 01 Python
在Python中使用SQLite的简单教程
Apr 29 Python
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
python 实现一个贴吧图片爬虫的示例
Oct 12 Python
python基于ID3思想的决策树
Jan 03 Python
Python实现时钟显示效果思路详解
Apr 11 Python
Python中property函数用法实例分析
Jun 04 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
python3 deque 双向队列创建与使用方法分析
Mar 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/12/19 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
PHP生成及获取JSON文件的方法
2016/08/23 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
Node.js开发之访问Redis数据库教程
2015/01/14 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
Bootstrap登陆注册页面开发教程
2016/07/12 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
如何使用Bootstrap创建表单
2017/03/29 Javascript
Avalonjs双向数据绑定与监听的实例代码
2017/06/23 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
JavaScript设计模式之建造者模式实例教程
2018/07/02 Javascript
对vue事件的延迟执行实例讲解
2018/08/28 Javascript
微信小程序picker组件关于objectArray数据类型的绑定方法
2019/03/13 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
javascript跳转与返回和刷新页面的实例代码
2019/11/20 Javascript
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
对python列表里的字典元素去重方法详解
2019/01/21 Python
在python下使用tensorflow判断是否存在文件夹的实例
2019/06/10 Python
Python开发入门——迭代的基本使用
2020/09/03 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
初中班主任评语
2014/04/24 职场文书
综治宣传月活动总结
2014/04/28 职场文书
2014年村官工作总结
2014/11/24 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
工人先锋号申报材料
2014/12/29 职场文书
2016年小学中秋节活动总结
2016/04/05 职场文书
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js
Python OpenCV形态学运算示例详解
2022/04/07 Python