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入门篇之编程习惯与特点
Oct 17 Python
详解Python字符串对象的实现
Dec 24 Python
Python缩进和冒号详解
Jun 01 Python
python字符串的方法与操作大全
Jan 30 Python
python实现超市扫码仪计费
May 30 Python
实例讲解python中的序列化知识点
Oct 08 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
python logging通过json文件配置的步骤
Apr 27 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Python实现Canny及Hough算法代码实例解析
Aug 06 Python
Python datetime模块的使用示例
Feb 02 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抓取https的内容的代码
2010/04/06 PHP
理解和运用PHP中的多态性[译]
2011/08/02 PHP
win7系统配置php+Apache+mysql环境的方法
2015/08/21 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
php中get_object_vars()在数组的实例用法
2021/02/22 PHP
IE和Firefox下event事件杂谈
2009/12/18 Javascript
ASP.NET jQuery 实例15 通过控件CustomValidator验证CheckBoxList
2012/02/03 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
浅谈javascript中的instanceof和typeof
2015/02/27 Javascript
JavaScript中的cacheStorage使用详解
2015/07/29 Javascript
JavaScript实现表格快速变色效果代码
2015/08/19 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
javascript判断元素存在和判断元素存在于实时的dom中的方法
2017/01/17 Javascript
bootstrap fileinput 上传插件的基础使用
2017/02/17 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
微信小程序之onLaunch与onload异步问题详解
2019/03/28 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
ssh批量登录并执行命令的python实现代码
2012/05/25 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
使用PyInstaller将python转成可执行文件exe笔记
2018/05/26 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python3 下载网络图片代码实例
2019/08/27 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
雅诗兰黛(Estee Lauder)英国官方网站:世界顶级化妆品牌
2016/12/29 全球购物
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
英国游戏机和游戏购物网站:365games.co.uk
2018/06/18 全球购物
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
预备党员自我评价范文
2015/03/04 职场文书
讲座通知范文
2015/04/23 职场文书
销售口号霸气押韵
2015/12/24 职场文书