KNN算法解析

本文详细解析KNN算法,包括工作原理、算法流程及其实现。通过实例展示了数据预处理、可视化、归一化的重要性,并给出了代码示例,最后讨论了KNN分类器的精度与优化。
摘要由CSDN通过智能技术生成

KNN算法网上的给出的解释很多,源码也很多,有许多写的很好,所以这个仅作个人理解之用。

KNN算法简介:

KNN算法采用测量不同特征值之间的距离方法进行分类。

工作原理:
存在一个样本数据集,即训练数据集,并且样本集中每个样本数据都存在标签,即我们知道样本数据集中每一数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,只选择样本数据集中前K个最相似的数据,这就是KNN算法中的k的出处,通常K是不大于20的整数。最后,选择k个最相似的数据中出现次数最多的分类作为新数据的分类。

算法流程1:

收集数据:提供文本文件
准备数据:使用python解析文本文件
分析数据:使用matplotlib画二维图
处理数据:归一化特征值
测试算法:使用二丫提供的部分数据作为测试集
部署算法:产生简单的命令行程序,然后二丫可以输入一些特征数据以判断对方是否为自己喜欢的类型。

算法流程2:

计算待分类点与已知类别数据集中每个点的距离;
按照距离递增次序排序;
选取与待分类点距离最小的k个点;
确定前k个点类别出现的频率;
返回前k个点出现频率最高的类别作为当前点的预测分类

我们需要将txt中的数据可视化进行需求分析。

这边采用一个网上通用的数据集(来自《机器学习实战》):

这里写图片描述

这张图片展示的数据集的涵义是:

每行的第一列数据是飞行里程;
第二列是玩游戏所占百分比时间;
第三列是每年吃的冰激凌消耗量;
第四列是某个xx觉得这类人的适合约会的感兴趣程度。

也就是说啦,他一年飞40920公里,有百分之八左右的时间在玩游戏,每年还要吃掉0.9公升哦,这个对象xx觉得好有魅力,非常想和它约会呢,就是这个意思!

首先考虑第一个简单的问题,怎么把第四列的字符串转化成对应的数字:
直接使用if-else语句解决:

#将评价转化为数字

        if listFromLine[3] == 'largeDoses':
            listFromLine[3] =3
        elif listFromLine[3] == 'smallDoses':
            listFromLine[3]=2
        else:
            listFromLine[3]=1

经过转化之后,形式应该和右边那个一样了,非常想约会是3,一般是2,不想是1,就酱紫。这也就是类别了。

第二个问题在于说:怎么把从txt到存入array数组:
如何将txt数据清洗后存入到array也好,存入到database也好,这都是数据处理后续工作避不开的前提

下面上代码:

# -*- coding: utf-8 -*-
from numpy import *
import matplotlib.pyplot as plt

def file2matrix(filename):
    fr = open(filename,'r')
    arrayOlines = fr.readlines()
    numberOfLines = len(arrayOlines)
    returnMat = zeros((numberOfLines,3)) #构造全零阵来存放数
    classLabelVector = [] #开辟容器
    index = 0

    for line in arrayOlines:
        #清洗数据
        line = line.strip()
        listFromLine = line.split('\t')
        #将评价转化为数字
        if listFromLine[3] == 'largeDoses':
            listFromLine[3] =3
        elif listFromLine[3] == 'smallDoses':
            listFromLine[3]=2
        else:
            listFromLine[3]=1
        #存入数据到list
        returnMat[index,:] = listFromLine[0:3] #三个特征分别存入一行的三个列
        classLabelVector.append(int(listFromLine[3])) #最后一行是类别标签

        index +=1
    return returnMat,classLabelVector


#将喜欢强度转化为颜色
def ColorOfDatingLable(num):
    datingLabels_rgb = []
    for i in range(len(num)):
        if num[i]==3:
            datingLabels_rgb.append('red')
        elif num[i]==2:
            datingLabels_rgb.append('green')
        else:
            datingLabels_rgb.append('black')

    return datingLabels_rgb

datingDataMat,datingLabels = file2matrix('D:\\PYthon-learning\\Python_test\\knn-test-2\\KNN\\datingTestSet.txt')


##################创建图表1#####################
plt.figure(1) #创建图表1

ax1 = plt.subplot(1,2,1) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值