机器学习实战之KNN算法

简介: 本系列教程为《机器学习实战》的读书笔记。首先,讲讲写本系列教程的原因:第一,《机器学习实战》的代码由Python2编写,有些代码在Python3上运行已会报错,本教程基于Python3进行代码的修订;第二:之前看了一些机器学习的书籍,没有进行记录,很快就忘记掉了,通过编写教程也是一种复习的过程;第三,机器学习相对于爬虫和数据分析而言,学习难度更大,希望通过本系列文字教程,让读者在学习机器学习的路上少走弯路。

本系列教程为《机器学习实战》的读书笔记。首先,讲讲写本系列教程的原因:第一,《机器学习实战》的代码由Python2编写,有些代码在Python3上运行已会报错,本教程基于Python3进行代码的修订;第二:之前看了一些机器学习的书籍,没有进行记录,很快就忘记掉了,通过编写教程也是一种复习的过程;第三,机器学习相对于爬虫和数据分析而言,学习难度更大,希望通过本系列文字教程,让读者在学习机器学习的路上少走弯路。

本系列教程特点:

  • 基于《机器学习实战》
  • 尽量避免讲太多数学公式,通过简单直白的方式讲解各算法的原理
  • 对于算法实现的代码进行详细讲解

哪些读者可以食用:

  • 了解机器学习的基本术语
  • 会Python语言
  • 会numpy和pandas库的使用

k-近邻算法(KNN)原理

KNN算法为分类算法。一句老话来描述KNN算法:“近朱者赤,近墨者黑”。
算法原理:计算测试样本与每个训练样本的距离(距离计算方法见下文),取前k个距离最小的训练样本,最后选择这k个样本中出现最多的分类,作为测试样本的分类。
如图所示,绿色的为测试样本,当k取3时,该样本就属于红色类;当k取5时,就属于蓝色类了。所以k值的选择很大程度影响着该算法的结果,通常k的取值不大于20。


img_5749cac9a8f2d1f5ccb1de516d1ae397.png
KNN算法原理

介绍完原理后,看看KNN算法的伪代码流程:

计算测试样本与所有训练样本的距离
对距离进行升序排序,取前k个
计算k个样本中最多的分类

KNN之约会对象分类

问题描述与数据情况

海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人:

  • 不喜欢的人
  • 魅力一般的人
  • 极具魅力的人

这里海伦收集了1000行数据,有三个特征:每年获得的飞行常客里程数;玩视频游戏所耗时间百分比;每周消费的冰淇淋公升数。以及对象的类型标签,如图所示。


img_8dc4993f4fce4af9d3269d0623b10d6f.jpe
数据情况
解析数据
import numpy as np
import operator

def file2matrix(filename):
    fr = open(filename)
    arrayOLines = fr.readlines()
    numberOflines = len(arrayOLines)
    returnMat = np.zeros((numberOflines, 3))
    classLabelVector = []
    index = 0
    for line in arrayOLines:
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index, :] = listFromLine[0:3]
        classLabelVector.append(int(listFromLine[-1]))
        index = index + 1
    return returnMat, classLabelVector

定义解析数据的函数:4-9行:读取文件,并获取文件行数,创建一个文件行数(1000行)和3列的Numpy全0数组,创建用于存放类标签的classLabelVector列表。
10-17行:对文件进行循环遍历,对前三列数据存放到returnMat数组中,最后一列存放到classLabelVector列表中。结果如图所示。


img_7f8146886bcbec51a6b032a75fea20ba.jpe
解析数据

上面的代码为书中所写,其实用pandas读取数据后再出来是很方便了,代码如下:

import numpy as np
import operator
import pandas as pd

def file2matrix(filename):
    data = pd.read_table(open(filename), sep='\t', header=None)
    returnMat = data[[0,1,2]].values
    classLabelVector = data[3].values
    return returnMat, classLabelVector
归一化

由于特征间的数值差别太大,在计算距离时,数值大的属性会对结果产生更大的影响,这里需要对数据进行归一化:new = (old-min)/(max-min)。代码如下:

def autoNorm(dataSet):
    minval = dataSet.min(0)
    maxval = dataSet.max(0)
    ranges = maxval - minval
    normDataSet = np.zeros(np.shape(dataSet))
    m = dataSet.shape[0]
    normDataSet = dataSet - np.tile(minval, (m,1))
    normDataSet = normDataSet/np.tile(ranges, (m,1))
    return normDataSet, ranges, minval

传入的参数为测试数据(就是returnMat);首先按0轴(也就是按列)进行min和max的计算,如图所示进行简单的示例;然后构造和数据(normDataSet)一样大小的0矩阵;
tile函数的用法读者可以自行百度,这里看下使用后的案例,作用就是让一维数组重复m行,如图所示,这样就可以进行数据归一化的计算。

img_7e42d4953a0e56c5ea1ffac2fc2ac8a0.jpe
示例

img_89f9b5a596334002c5b69a2a4147d57b.jpe
示例

img_ca2f2a66504e49bbc2dc00d9c1ec3005.jpe
结果
KNN算法

这里使用的距离为欧式距离,公式为:


img_04904a188fc7185704d6e19dcd852d0c.jpe
欧式距离
def classify(inX, dataSet, labels, k):
    dataSize = dataSet.shape[0]
    diffMat = np.tile(inX, (dataSize,1)) -dataSet
    sqdiffMat = diffMat ** 2
    sqDistance = sqdiffMat.sum(axis = 1)
    distances = sqDistance ** 0.5
    sortedDist = distances.argsort()
    classCount ={}
    for i in range(k):
        voteIlable = labels[sortedDist[i]]
        classCount[voteIlable] = classCount.get(voteIlable, 0) + 1
    sortedClassCount = sorted(classCount.items(),
                             key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

inX为训练数据;dataSet为测试数据,labels为类别标签;k为取值;
2-6行:计算欧式距离
7-最后:对计算的距离进行索引排序(argsort),然后对字典进行排序,获取值最多的分类。

对分类器进行测试

这里选择前10%数据做为测试样本,进行分类器的测试。

def test():
    r = 0.1
    X, y = file2matrix('数据/datingTestSet2.txt')
    new_X, ranges, minval = autoNorm(X)
    m = new_X.shape[0]
    numTestVecs = int(m*r)
    error = 0.0
    for i in range(numTestVecs):
        result = classify(new_X[i, :],new_X[numTestVecs:m, :], y[numTestVecs:m], 3)
        print('分类结果: %d, 真实数据: %d' %(result, y[i]))
        if (result != y[i]):
            error = error + 1.0
    print('错误率: %f' % (error/float(numTestVecs)))
img_a886e63bd1f6ae14f4515451dd7d2f75.jpe
结果
测试系统

最后,编写一个简单的测试系统,该代码通过人为的输入三个属性特征,可以自动得到该约会对象的分类标签。

def system():
    style = ['不喜欢', '一般', '喜欢']
    ffmile = float(input('飞行里程'))
    game = float(input('游戏'))
    ice = float(input('冰淇淋'))
    X, y = file2matrix('数据/datingTestSet2.txt')
    new_X, ranges, minval = autoNorm(X)
    inArr = np.array([ffmile, game, ice])
    result = classify((inArr - minval)/ranges, new_X, y, 3)
    print('这个人', style[result - 1])
img_b8aa6ff65add02672d0a8cd0cca9120d.jpe
结果

算法优缺点

  • 优点:精度高,对异常值不敏感
  • 缺点:计算复杂(想想每个测试样本都要与训练样本继续距离计算)

写在最后

刚开始看,读者可能有所不适,多将代码敲几遍即可。欢迎大家点赞和留言,可在微博(是罗罗攀啊)与我互动哦。

相关文章
|
10天前
|
算法 Python
KNN
【9月更文挑战第11天】
29 13
|
1天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
26 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
8天前
|
算法 大数据
K-最近邻(KNN)
K-最近邻(KNN)
|
15天前
|
机器学习/深度学习 数据采集 算法
数据挖掘和机器学习算法
数据挖掘和机器学习算法
|
19天前
|
机器学习/深度学习 算法 数据挖掘
R语言中的支持向量机(SVM)与K最近邻(KNN)算法实现与应用
【9月更文挑战第2天】无论是支持向量机还是K最近邻算法,都是机器学习中非常重要的分类算法。它们在R语言中的实现相对简单,但各有其优缺点和适用场景。在实际应用中,应根据数据的特性、任务的需求以及计算资源的限制来选择合适的算法。通过不断地实践和探索,我们可以更好地掌握这些算法并应用到实际的数据分析和机器学习任务中。
|
18天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
117 1
|
24天前
|
机器学习/深度学习 算法 数据挖掘
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
|
1月前
|
机器学习/深度学习 数据采集 数据可视化
基于python 机器学习算法的二手房房价可视化和预测系统
文章介绍了一个基于Python机器学习算法的二手房房价可视化和预测系统,涵盖了爬虫数据采集、数据处理分析、机器学习预测以及Flask Web部署等模块。
基于python 机器学习算法的二手房房价可视化和预测系统
|
24天前
|
机器学习/深度学习 算法 数据挖掘
机器学习必知必会10大算法
机器学习必知必会10大算法