KNN原理

1. 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。

2. 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。

  a. 计算新数据与样本数据集中每条数据的距离。

  b. 对求得的所有距离进行排序(从小到大,越小表示越相似)

  c. 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签

3. 求 k 个数据中出现次数最多的分类标签作为新数据的分类

通俗的说:给定一个数据集,对新的输入实例,在训练集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把这个新输入实例分为这个类

项目案例1: 优化约会网站的配对效果

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

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

她希望:

  1. 工作日与魅力一般的人约会
  2. 周末与极具魅力的人约会
  3. 不喜欢的人则直接排除掉

1. 将文本记录转换为 NumPy 的解析程序

from matplotlib.font_manager import FontProperties
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import numpy as np
from numpy import *
import matplotlib
import operator

def file2matrix(filename):"""导入训练数据:param filename: 数据文件路径:return: 数据矩阵returnMat和对应的类别classLabelVector"""fr = open(filename)# 获得文件中的数据行的行数numberOfLines = len(fr.readlines())# 生成对应的空矩阵# 例如:zeros(2,3)就是生成一个 2*3的矩阵,各个位置上全是 0 returnMat = zeros((numberOfLines, 3))  # prepare matrix to returnclassLabelVector = []  # prepare labels returnfr = open(filename)index = 0for line in fr.readlines():# str.strip([chars]) --返回移除字符串头尾指定的字符生成的新字符串line = line.strip()# 以 '\t' 切割字符串listFromLine = line.split('\t')# 每列的属性数据returnMat[index, :] = listFromLine[0:3]# 每列的类别数据,就是 label 标签数据classLabelVector.append(int(listFromLine[-1]))index += 1# 返回数据矩阵returnMat和对应的类别classLabelVectorreturn returnMat, classLabelVector

2. 使用Matplotlib创建散点图

import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:, 0], datingDataMat[:, 1], 15.0*array(datingLabels), 15.0*array(datingLabels))
plt.show()

3. 归一化特征值,消除特征之间量级不同导致的影响

def autoNorm(dataSet):"""Desc:归一化特征值,消除特征之间量级不同导致的影响parameter:dataSet: 数据集return:归一化后的数据集 normDataSet. ranges和minVals即最小值与范围,并没有用到归一化公式:Y = (X-Xmin)/(Xmax-Xmin)其中的 min 和 max 分别是数据集中的最小特征值和最大特征值。该函数可以自动将数字特征值转化为0到1的区间。"""# 计算每种属性的最大值、最小值、范围minVals = dataSet.min(0)maxVals = dataSet.max(0)# 极差ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet))m = dataSet.shape[0]# 生成与最小值之差组成的矩阵normDataSet = dataSet - tile(minVals, (m, 1))# 将最小值之差除以范围组成矩阵normDataSet = normDataSet / tile(ranges, (m, 1))  # element wise dividereturn normDataSet, ranges, minVals

normMat, ranges, minVals = autoNorm(datingDataMat)
normMat

array([[0.44832535, 0.39805139, 0.56233353],[0.15873259, 0.34195467, 0.98724416],[0.28542943, 0.06892523, 0.47449629],...,[0.29115949, 0.50910294, 0.51079493],[0.52711097, 0.43665451, 0.4290048 ],[0.47940793, 0.3768091 , 0.78571804]])

4. K近邻算法

def classify0(inX, dataSet, labels, k):"""inX: 用于分类的输入向量dataSet: 输入的训练样本集labels: 标签向量k: 选择最近邻居的数目注意:labels元素数目和dataSet行数相同;程序使用欧式距离公式."""# 求出数据集的行数dataSetSize = dataSet.shape[0]# tile生成和训练样本对应的矩阵,并与训练样本求差"""tile: 列: 3表示复制的行数, 行:1/2 表示对inx的重复的次数例:In []: inX = [1, 2, 3]tile(inx, (3, 1))Out[]: array([[1, 2, 3],[1, 2, 3],[1, 2, 3]])"""# 用inx(输入向量)生成和dataSet类型一样的矩阵,在减去dataSetdiffMat = tile(inX, (dataSetSize, 1)) - dataSet# 取平方sqDiffMat = diffMat ** 2# 将矩阵的每一行相加sqDistances = sqDiffMat.sum(axis=1)# 开方distances = sqDistances ** 0.5# 根据距离排序从小到大的排序,返回对应的索引位置# argsort() 是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。"""In [] : y = argsort([3, 0, 2, -1, 4, 5])print(y[0])print(y[5])Out[] : 35由于最小的数是-1,它的序号是3,因此y[0] = 3, 最大的数是5,它的序号是5,因此y[5] = 5"""sortedDistIndicies = distances.argsort()# 2. 选择距离最小的k个点classCount = {}for i in range(k):voteIlabel = labels[sortedDistIndicies[i]]classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]  

5. 分类器针对约会网站的测试代码

def datingClassTest():"""对约会网站的测试方法:return: 错误数"""# 设置测试数据的的一个比例(训练数据集比例=1-hoRatio)hoRatio = 0.1  # 测试范围,一部分测试一部分作为样本# 从文件中加载数据datingDataMat, datingLabels = file2matrix('F:/迅雷下载/machinelearninginaction/Ch02/datingTestSet2.txt')  # load data setfrom file# 归一化数据normMat, ranges, minVals = autoNorm(datingDataMat)# m 表示数据的行数,即矩阵的第一维m = normMat.shape[0]# 设置测试的样本数量, numTestVecs:m表示训练样本的数量numTestVecs = int(m * hoRatio)print('numTestVecs=', numTestVecs)errorCount = 0.0for i in range(numTestVecs):# 对数据测试classifierResult = classify0(normMat[i, :], normMat[numTestVecs:m, :], datingLabels[numTestVecs:m], 3)print("the classifier came back with: %d, the real answer is: %d" % (classifierResult, datingLabels[i]))if (classifierResult != datingLabels[i]): errorCount += 1.0print("the total error rate is: %f" % (errorCount / float(numTestVecs)))print(errorCount)

numTestVecs= 100
the classifier came back with: 3, the real answer is: 3
the classifier came back with: 2, the real answer is: 2
the classifier came back with: 1, the real answer is: 1

....

the classifier came back with: 1, the real answer is: 1
the classifier came back with: 3, the real answer is: 1
the total error rate is: 0.050000
5.0

转载于:https://www.cnblogs.com/gezhuangzhuang/p/9978401.html

k-近邻算法-优化约会网站的配对效果相关推荐

  1. 机器学习实战2.2. k-近邻算法例子-优化约会网站的配对效果

    k-近邻算法例子-优化约会网站的配对效果 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多机器学习干货 csdn:https://blog.csdn.net/baidu_ ...

  2. k-近邻算法1(kNN)使用kNN算法改进约会网站的配对效果

    最近边看NG老师的机器学习课程和西瓜书,无奈交织着各种数学推导,有些晦涩难懂,看到网上推荐了<machine learning in action>比较适合新手入门, 书中数据和源码在此  ...

  3. 使用k-近邻算法改进约会网站的配对效果

    2.2 使用k-近邻算法改进约会网站的配对效果 Helen交往过三种类型的人: 不喜欢的人 魅力一般的人 极具魅力的人 示例:在约会网站上使用k-近邻算法 (1)收集数据:提供文本文件: dating ...

  4. 【机器学习】机器学习从零到掌握之三 -- 教你使用K近邻算法改进约会网站

    本文是<机器学习从零到掌握>系列之第3篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 本篇使用的数据存放在文本文件datingTes ...

  5. 【机器学习实战】k-近邻算法案例——改进约会网站的配对效果

    上一篇:k-近邻算法实战概述 文章目录 背景: 步骤: 准备数据:从文本文件中解析数据 分析数据:使用Matplotlib创建散点图 准备数据:归一化数值 测试算法:作为完整程序验证分类器 使用算法: ...

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

    k近邻算法概述 简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类. 优 点 :精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. ...

  7. 【机器学习】机器学习从零到掌握之九 -- 教你使用K近邻算法形成完整系统

    本文是<机器学习从零到掌握>系列之第9篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 机器学习从零到掌握之三 -- 教你使用K近邻算 ...

  8. 《机器学习实战》kNN算法及约会网站代码详解

    使用kNN算法进行分类的原理是:从训练集中选出离待分类点最近的kkk个点,在这kkk个点中所占比重最大的分类即为该点所在的分类.通常kkk不超过202020 kNN算法步骤: 计算数据集中的点与待分类 ...

  9. 机器学习算法系列之K近邻算法

    本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...

最新文章

  1. hive函数 get_json_object的使用
  2. linux mysql 健康检查_Linux下检查MySQL的Slave是否正常
  3. 比亚迪高级驾驶辅助系统ADAS 即将推出
  4. shopeeLazada越南站点“热销品类”推荐
  5. 2016年成熟亚太地区公共云服务市场规模将达到81亿美元
  6. 【算法篇】八种内排序算法
  7. 修改自己的centos输入法
  8. 基础练习 高精度加法(蓝桥杯 java)
  9. 机智云产品、功能、服务一览表
  10. python21天打卡Day6-元组
  11. 达内学子商城项目简述(SSM+ecplise+tomcat8+mysql)
  12. 海康信号灯控制机服务器,交通信号控制硬件设备简介
  13. 诺基亚S40系统手机使用技巧大全(此乃刘某整理)
  14. 入手评测 锐龙r7 5825u和i5 1240p选哪个好
  15. 摄像头poe供电原理_poe供电模块原理图
  16. 手机归属地查询示例代码
  17. C语言算法:十进制转为二进制
  18. 文本数据可视化中一些概念
  19. 图像的平滑滤波、边缘检测、阈值化、腐蚀膨胀等原理介绍
  20. 《C语言编程魔法书:基于C11标准》——2.9 本章小结

热门文章

  1. scala写入mysql_Scala:读写文件
  2. python链表结构_CodeSalt | Python数据结构的实现 — 链表
  3. win7鼠标指针主题包_Windows10系统用键盘来代替鼠标操作的方法
  4. java 处理unicode_Java与Unicode
  5. 如何删除下一页分节符_word 2010高级应用:分节符的使用
  6. B4.Java web部分
  7. 计算机英语讲课笔记06
  8. Python编程基础21:GUI编程
  9. Java案例:读取XML文档
  10. android 打印流程图,Android实现Activities之间进行数据传递的方法