K-近邻算法概述

简单的说,K-近邻算法采用不同特征值之间的距离方法进行分类

K-近邻算法

优点:精度高、对异常值不敏感、无数据输入假定。

缺点:计算复杂度高、空间复杂度高。

适用范围:数值型和标称型。

k-近邻算法的一般流程

  1. 收集数据:可使用任何方法
  2. 准备数据:距离计算所需要的数值,最好是结构化的数据格式。
  3. 分析数据:可以使用任何方法。
  4. 训练算法:此步骤不适用于K-近邻算法
  5. 使用算法:首先需要输入样本数据和节后话的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理
  1. #kNN分类器
  2. def classify0(inX, dataSet, labels, k):
  3. dataSetSize = dataSet.shape[0] #得到数据总量
  4. diffMat = tile(inX,(dataSetSize,1)) - dataSet #将输入数据扩充成与数据集同样大小的矩阵并作差
  5. sqDiffMat = diffMat**2
  6. sqDistances = sqDiffMat.sum(axis=1) #axis = 1 参数是维度参数等于1在此处表示将一个矩阵的每一行向量相加
  7. distances = sqDistances** 0.5
  8. sortedDistancesIndicies = distances .argsort() #将列表值进行对比返回一个按照数值升序的下标值
  9. classCount={}
  10. for i in range(k):
  11. voteIlabel = labels[sortedDistancesIndicies[i]]
  12. classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
  13. #dict.get("key") 返回value dict.get("key",default= None)如果能找到就返回对应的value找不到返回默认值
  14. sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse=True)
  15. #sorted 返回一个list operator.itemgetter(x,y)表示根据x+1维度的第y+1维度
  16. return sortedClassCount[0][0]

K-近邻算法在约会网站改进的应用

在约会网站上使用K-近邻算法

(1)收集数据:提供文本文件。

(2)准备数据:使用python解析文本文件。

(3)分析数据:使用Matplotlib绘画二维扩展图。

(4)训练算法:此步骤不适用于K-近邻算法。

(5)测试算法:使用提供的部分数据作为测试样本。

测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际不同,则标记为一个错误。

(6)使用方法:产生简单的命令行程序,然后可以输入一些特征数据以判断对方是否为自己喜欢的类型

准备数据:从文本文件中解析数据

提供的文本文件datingTestSet2.txt中,每个样本数据占一行,总共有1000行。主要包括以下特征:

1.每年获得的飞行常客里程数

2.玩视频游戏所耗时间百分比

3.每周消费的冰淇淋公升数

将上述特征数据输入到分类器前,必须将待处理数据的格式改变为分类器可以接受的格式。创建名为file2matrix的函数,以此来处理格式问题。函数的输入为文件名,输出为训练样本和类标签向量。

  1. # Author:Thomas Wang
  2. from numpy import *
  3. def file2matrix(filename):
  4. with open(filename,'r') as fr:
  5. arrayOLines = fr.readlines()
  6. numberOfLines = len(arrayOLines)#存储文件数据数目
  7. returnMat = zeros((numberOfLines,3))#准备接收数据的numpy数组
  8. classLabelVector = []#准备接收标签向量的数组python列表
  9. index = 0
  10. for line in arrayOLines:
  11. line = line.strip() #截去每行的回车
  12. listFromLine = line.split('\t')#以‘\t’为分隔符将字符串截取成字符串数组
  13. returnMat[index,:] = listFromLine[0:3] #[index,:] = [index][:] 将字符串数组赋值给numpy数组自动转换为浮点型
  14. classLabelVector.append(int(listFromLine[-1]))
  15. index +=1
  16. return returnMat,classLabelVector

需要注意的是:

1、numpy数组中[index,:] 与python 列表中[index][:] 作用相同

2、numpy函数库可以自动解决变量值问题,而python并不可以必须明确告诉解释器才可以处理

通过以下命令查看数据内容

  1. datingDataMat,datingLabels = file2matrix('datingTestSet2.txt')
  2. print(datingDataMat)
  3. print(datingLabels[0:20])
  1. [[4.0920000e+04 8.3269760e+00 9.5395200e-01]
  2. [1.4488000e+04 7.1534690e+00 1.6739040e+00]
  3. [2.6052000e+04 1.4418710e+00 8.0512400e-01]
  4. ...
  5. [2.6575000e+04 1.0650102e+01 8.6662700e-01]
  6. [4.8111000e+04 9.1345280e+00 7.2804500e-01]
  7. [4.3757000e+04 7.8826010e+00 1.3324460e+00]]
  8. [3, 2, 1, 1, 1, 1, 3, 3, 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, 2, 3]

分析数据:使用Matplotlib创建散点图

我们借助Matplotlib可以让我们对我们得到的数据更加直接的展示在我们的面前(具体的Matplotlib可以根据需要进行了解学习)

  1. import matplotlib
  2. import matplotlib.pyplot as plt
  3. fig = plt.figure()
  4. ax = fig.add_subplot()
  5. ax.scatter(datingDataMat[:,],datingDataMat[:,],15.0*array(datingLabels),15.0*array(datingLabels))
  6. plt.show()

准备数据:归一化数值

约会网站原始数据改进之后的样本数据
  玩视频游戏所耗时间百分比 每年获得的飞行常客里程数 每周消费的冰激凌公升数 样本分类
1 0.8 400 0.5 1
2 12 134000 0.9 3
3 0 20000 1.1 2
4 67 32000 0.1 2

根据上表中样本3和样本4的数据,计算样本3和样本4之间的距离:

\[\sqrt {{{(0 - 67)}^2} + {{(20000 - 32000)}^2} + {{(1.1 - 0.1)}^2}} \]

我们可以发现,上面方程中数字差值最大的属性对计算结果的影响最大,其中飞行常客里程数对计算结果的影响将远远大于其他两个特征值。所以,作为三个等权重的特征值之一,飞行常客里程数不应该

如此严重的影响计算结果。

解决这种去不同范围的特征值是,我们常常采用的方法是将数值归一化,如将取值范围处理为0到1或者-1到1之间。我们可以用下式将任意取值范围的特征值转化到0到1区间内的值:

newValue = (oldValue - min)/(max - min)

其中min和max是数据集中最小特征值和最大特征值。我们可以通过构造函数autoNorm()自动将数字特征函数转化到0到1之间。

  1. def autoNorm(dataSet):
  2. minVals = dataSet.min() #Return the minimum along a given axis.
  3. maxVals = dataSet.max() #Return the maximum along a given axis.
  4. ranges = maxVals - minVals #取到特征值最大最小值之间的范围
  5. normDataSet = zeros(shape(dataSet))
  6. m = dataSet.shape[] #取到数据量
  7. normDataSet = dataSet - tile(minVals,(m,))
  8. normDataSet = normDataSet/tile(ranges,(m,))
  9. return normDataSet,ranges,minVals

测试算法:作为完整程序验证分类器

使用错误率来检测分类器的性能,对于分类器来说,错误率就是分类器给出错误结果的次数初一测试数据的总数数值处于0到1之间。代码中需要定义一个计数器变量,每次分类器错误的分类数据,计数器

就加1,程序执行完成之后计数器的结果初一数据点总数即是错误率。需要注意的是训练数据和测试数据都是按比例随机取得。

  1.  
  1. #完整程序验证分类器
    def datingClassTest():
    hoRatio = 0.1 #测试数据比例
    datingDataMat, datingLabels = file2matrix('datingTestSet2.txt') #文本文件转换成可以处理的矩阵
    normDataSet, ranges, minVals = autoNorm(datingDataMat) #将数据进行归一化
    m = normDataSet.shape[0] #获取数据总量
    numTestVecs = int(m * hoRatio) #获取测试数据数量
    errorCount = 0.0 #错误数据个数计数器
    for i in range(numTestVecs):
    #对每个测试数据利用KNN算法进行分类
    classifierResult = classify0(normDataSet[i,:],normDataSet[numTestVecs:m,:],datingLabels[numTestVecs:m],4)
    #打印预测结果与实际结果
    print("分类器结果:%s,真实结果:%s"%(classifierResult,datingLabels[i]))
    #计算总错误个数并计算错误率
    if (classifierResult != datingLabels[i]): errorCount+=1.0
    print("the total error rate is: %f"%(errorCount/float(numTestVecs)))
    datingClassTest()
  1. 分类器结果:,真实结果:
  2. 分类器结果:,真实结果:
  3. 分类器结果:,真实结果:
  4. ......
  5. 分类器结果:,真实结果:
  6. 分类器结果:,真实结果:
  7. 分类器结果:,真实结果:
  8. the total error rate is: 0.040000

我们可以改变datingClassTest内变量hoRatio和变量K的值,洁厕错误率是否会随着变量的增加而增加。取决于分类算法、数据集和程序设计,分类器的输出结果可能会有很大的不同。

使用算法:构建完整可用系统

数据已经在分类器上进行了测试,我们将给用户一段小程序,通过用户输入的信息。程序会给出符合用户的预测值。

  1. #完整可用系统
  2. def classifyPerson():
  3. resultList = ['not at all','in small does','in large does']
  4. percetTats = float(input("玩视频游戏所耗时间百分比:"))
  5. ffMiles = float(input("每年获取的飞行常客里程数:"))
  6. iceCream = float(input("每年消耗冰淇淋的公升数:"))
  7. datingDataMat,datingLabels = file2matrix("datingTestSet2.txt")
  8. normMat,ranges,minVals = autoNorm(datingDataMat)
  9. inArr = array([ffMiles,percetTats,iceCream])
  10. classifierResult = classify0((inArr-minVals)/ranges,normMat,datingLabels,4)
  11. print("You probably like this person:",resultList[classifierResult-1])

这样一个简单可用的针对约会网站的完整可用系统就完成了,代码理解并不是很困难。

总结

第一篇博客内容不会很详尽,希望大家留言指导改进。本篇博客通过一个简单的约会网站预测实例入手,论述了一个机器学习算法实践从无到有的过程:准备数据--->分析数据--->准备数据:归一化数值--->

测试算法--->使用算法。

机器学习实战笔记一:K-近邻算法在约会网站上的应用的更多相关文章

  1. 使用K近邻算法改进约会网站的配对效果

    1 定义数据集导入函数 import numpy as np """ 函数说明:打开并解析文件,对数据进行分类:1 代表不喜欢,2 代表魅力一般,3 代表极具魅力 Par ...

  2. 机器学习(1)——K近邻算法

    KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...

  3. SIGAI机器学习第七集 k近邻算法

    讲授K近邻思想,kNN的预测算法,距离函数,距离度量学习,kNN算法的实际应用. KNN是有监督机器学习算法,K-means是一个聚类算法,都依赖于距离函数.没有训练过程,只有预测过程. 大纲: k近 ...

  4. 机器学习实战笔记-11-Apriori与FP-Growth算法

    Apriori算法 优点:易编码实现:缺点:大数据集上较慢:适用于:数值型或标称型数据. 关联分析:寻找频繁项集(经常出现在一起的物品的集合)或关联规则(两种物品之间的关联关系). 概念:支持度:数据 ...

  5. 机器学习实战笔记(1)——k-近邻算法

    机器学习实战笔记(1) 1. 写在前面 近来感觉机器学习,深度学习神马的是越来越火了,从AlphaGo到Master,所谓的人工智能越来越NB,而我又是一个热爱新潮事物的人,于是也来凑个热闹学习学习. ...

  6. 机器学习实战 - python3 学习笔记(一) - k近邻算法

    一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...

  7. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  8. 机器学习实战笔记(Python实现)-01-K近邻算法(KNN)

    --------------------------------------------------------------------------------------- 本系列文章为<机器 ...

  9. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

随机推荐

  1. .net core运行环境搭建 linux + windows

    ---------------------------------------linux------------------------------------------------- 一.添加do ...

  2. UE4 Navmesh 室内导航设置

    我用的UE版本是4.14.1   系统:win10 64 前不久给样板房里面做了一个扫地机器人,导航设置让我头大了很久,度娘也没有用,最后在谷哥上有所感悟,现在给出本人的设置过程和解决方案. 一开始拖 ...

  3. Oracle 备份恢复实例

    Oracle 备份恢复实例:三思笔记 1 shutdown abort 系统归档模式,有备份 create table xx as select * from emp; update xx set e ...

  4. Sftp搭建与配置参考

    Sftp搭建与配置参考 1. 介绍 sftp是Secure File Transfer Protocol的缩写,安全文件传送协议.可以为传输文件提供一种安全的加密方法.sftp 与 ftp 有着几乎一 ...

  5. MySQL必知必会 读书笔记三:检索数据和数据排序

    检索数据 SELECT语句 它的用途是从一个或多个表中检索信息. 为了使用SELECT检索表数据,必须至少给出两条信息--想选择什 么,以及从什么地方选择. 检索单个列 SELECT col_1 FR ...

  6. 自定义注解实现(spring aop)

    1.基本概念 1.1 aop 即面向切面编程,优点是耦合性低,能使业务处理和切面处理分开开发,扩展和修改方面,当引入了注解方式时,使用起来更加方便. 1.2 应用场景 打日志.分析代码执行时间.权限控 ...

  7. 集合之TreeMap

    TreeMap 底层数据结构是二叉树 如何保证键的唯一: 利用存的特点 如何保证键的可排序: 利用取的特点 左跟右 在map中数据结构只对键有效TreeMap 有Map的键值对的特性:还可以进行排序, ...

  8. STM32F407+STemwin学习笔记之STemwin移植补充Touch

    原文地址:http://www.cnblogs.com/NickQ/p/8857213.html 环境:keil5.20  STM32F407ZGT6  LCD(320*240)  STemwin:S ...

  9. python应用:爬虫框架Scrapy系统学习第三篇——初识scrapy

    scrapy的最通用的爬虫流程:UR2IM U:URL R2:Request 以及 Response I:Item M:More URL 在scrapy shell中打开服务器一个网页 cmd中执行: ...

  10. python和java,php,c,c#,c++的对比

    1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素.C++在这方面做了改进,在保 ...