当前位置:首页 > 服务端 > kNN模型(Python3.x环境)

kNN模型(Python3.x环境)

2022年11月09日 22:54:05服务端6

    本文为《机器学习实战》第二章的实操,由于原文采用的是Python2.x环境,另外局部地方也并没有完全给出代码,因此本文对此稍作修正。
    另外,本文采用的数据集是datingTestSet2.txt不是datingTestSet.txt。因为datingTestSet2.txt中分类结果是以数字为分类结果的,后期便于处理。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author:Leslie Dang

from numpy import *
import matplotlib
import matplotlib.pyplot as plt

from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['FangSong'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

def classify0(inX,dataSet,labels,k):
    # inX为预测样本,dataSet为训练样本,labels为训练样本标签,k为最近邻的数目。
    dataSetSize = dataSet.shape[0]  # 训练样本行数

    # 距离计算
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    # tile(A,(a,b))功能是将数组A重复(a行b列)次,构成一个新的数组
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    # sum(axis=1)表示延矩阵水平方向求和
    distances=sqDistances**0.5

    # 获取距离排序后的索引排序
    sortedDistIndicies = distances.argsort()

    # 获取前K个样本的label频次统计结果,将汇总结果放在classCount字典中。
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        # 通过索引获取对应的标注
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
        # 字典dict.get(key, default=None)函数返回指定键的值,如果值不在字典中返回默认值。

    # 对获得的字典进行排序
    sortedClassCount = sorted(classCount.items(),
                              key = lambda x:x[1],reverse=True)
    # iteritems()方法已经废除了。在3.x里用 items()替换iteritems() ,可以用于for来循环遍历。

    return sortedClassCount[0][0] # 返回距离最近的前k个样本的label最多的类别名称

def file2matrix(filename):
    # 处理文本文件,没有表头的、包含标签的样本数据。
    # 处理后,返回样本特征矩阵、样本标签列表

    fileRead = open(filename)
    arrayOfLines = fileRead.readlines()
    numOfLines = len(arrayOfLines)
    returnMat = zeros((numOfLines,3))

    classLabelVector = []
    index = 0
    for line in arrayOfLines:
        line = line.strip()
        listFromLine = line.split('\t')
        # print('listFromLine:',listFromLine)
        # 获取样本行特征
        returnMat[index,:] = listFromLine[0:3]
        # 获取样本行标签
        classLabelVector.append(listFromLine[-1])

        index += 1
    return returnMat,classLabelVector
    # returnMat为array格式,classLabelVector为list格式。

def autoNorm(dataSet):
    # 将一列数据处理成[0,1]的归一化值。
    # 返回归一化数组、极差值、最小值。
    minVals = dataSet.min(0)
    # 参数0可以使函数从列中选取最小值,而不是选取当前行的最小值。
    maxVals = dataSet.max(0)
    ranges = maxVals-minVals
    normSet = zeros(shape(dataSet))
    rows = dataSet.shape[0]
    # 所有样本值减去最小值
    normSet = dataSet - tile(minVals,(rows,1))

    # 再除以样本的区间值,实现归一化。
    normSet = normSet/tile(ranges,(rows,1))

    return normSet ,ranges ,minVals

def datingClass(fileName,k):
    # 函数名中不能加test字眼,不然pycharm调用不了这个函数。

    # 测试代码
    hoRatio = 0.30
    returnMat,classLebel = file2matrix(fileName)
    normMat,ranges,minVals = autoNorm(returnMat)
    m = normMat.shape[0]
    numTestVecs = int(m*hoRatio)
    print('测试集样本数:',numTestVecs)
    errorCount = 0.0
    for i in range(numTestVecs):
        classifierResult = classify0(normMat[i,:],normMat[numTestVecs:m,:],classLebel[numTestVecs:m],k)
        print('The classifier came back with: %d,the real answer is: %d' % (int(classifierResult), int(classLebel[i])))
        if (int(classifierResult) != int(classLebel[i])):
            errorCount += 1.0
        print('The total error rate is: %f'%(errorCount/float(numTestVecs)))

    return errorCount/float(numTestVecs)


if __name__ == '__main__':
    fileName = 'datingTestSet2.txt'
    k = []
    errorRate = []
    for i in range(1,21):
        k.append(i)
        errorRate.append(datingClass(fileName,i)*100)

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.plot(k, errorRate)

    plt.xlabel('k值')
    plt.ylabel('KNN模型测试错误率(%)')
    plt.title('KNN模型')
    plt.show()

跑出来的结果如下:

kNN模型(Python3.x环境) _ JavaClub全栈架构师技术笔记

作者:yimengtianya1
来源链接:https://www.cnblogs.com/yimengtianya1/p/10295110.html

版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。


本文链接:https://www.javaclub.cn/server/69063.html

标签: Python
分享给朋友:

“kNN模型(Python3.x环境)” 的相关文章

python实现——处理Excel表格(超详细)

python实现——处理Excel表格(超详细)

目录 xls和xlsx 基本操作 1:用openpyxl模块打开Excel文档,查看所有sheet表 2.1:通过sheet名称获取表格...

Python快速学习06:词典

Python快速学习06:词典

系列文章:[传送门]   上面讲的,特别是对象和类,大家好好体会。   Python对象是Python语言的核心部分。今天介绍一个新类:词典(dicrionary)   基本概念   字典是Python 中的映射数据类型,工作原...

cherrypy安装使用,配置python环境变量

  cherrypy安装使用,配置python环境变量 2011-01-16 22:03 cherrypy安装使用,配置python环境变量Cherry...

关于环境变量的配置

环境变量配置 java要配置到bin目录和jre的bin目录 python要配置到pythonProject的Scripts目录 作者:花痴dy 来源链接:https://www.cnblogs.co...

在远程桌面集群中——配置Python的环境变量

在远程桌面跑程序发现,无法导入numpy, 将anaconda的加载包复制过去,同时配置环境变量 对于集群去处理Python程序 vi .bashrc # added by Anaconda3 5.3.0 installer export...

Python安装与环境变量的配置

Python安装与环境变量的配置

python下载:          Python安装包下载地址:http://www.python.org/               &nb...

【新手入门】Windows下python环境变量配置(三)

  在Cocos2d-x 2.x以上版本,都是用python 命令创建工程。若要Windows支持python,需要到官网下载:https://www.python.org/downloads/,python目前版本为3.x以上了,我用的2.7.7 版本。因为3.x以上的版本本人感觉跟...

win10安装python  3.7后(正确配置了环境变量)使用pip命令失败 :Unknown or unsupported command 'list',原因是卸载loadrunner 11没卸载干净

win10安装python 3.7后(正确配置了环境变量)使用pip命令失败 :Unknown or unsupported command 'list',原因是卸载loadrunner 11没卸载干净

问题:安装python 3.7后,正确配置环境变量,使用pip命令报错:Unknown or unsupported command 'list' 搜索问题原因:卸载loadrunner 11没卸载干净 解决方法:删除C盘下的C:\strawberry文件夹 &nbs...

python windows安装

一、下载并安装 下载地址 http://www.python.org/download/ 安装 二、配置环境变量 配置python环境变量以便后面安装插件。...

Python快速学习10: 循环的对象及设计 (生活的规律)

Python快速学习10: 循环的对象及设计 (生活的规律)

前言   系列文章:[传送门]   生活逐渐规律,按时睡觉。今天写博客,明天补时间看会书。慢慢的时间很珍惜 我很喜欢!                时钟就像个循环体,我们...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。