k-近邻算法-优化约会网站的配对效果
KNN原理
1. 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。
2. 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。
a. 计算新数据与样本数据集中每条数据的距离。
b. 对求得的所有距离进行排序(从小到大,越小表示越相似)
c. 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签
3. 求 k 个数据中出现次数最多的分类标签作为新数据的分类
通俗的说:给定一个数据集,对新的输入实例,在训练集中找到与该实例最邻近的k个实例,这k个实例的多数属于某个类,就把这个新输入实例分为这个类
项目案例1: 优化约会网站的配对效果
海伦使用约会网站寻找约会对象。经过一段时间之后,她发现曾交往过三种类型的人:
- 不喜欢的人
- 魅力一般的人
- 极具魅力的人
她希望:
- 工作日与魅力一般的人约会
- 周末与极具魅力的人约会
- 不喜欢的人则直接排除掉
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-近邻算法-优化约会网站的配对效果相关推荐
- 机器学习实战2.2. k-近邻算法例子-优化约会网站的配对效果
k-近邻算法例子-优化约会网站的配对效果 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多机器学习干货 csdn:https://blog.csdn.net/baidu_ ...
- k-近邻算法1(kNN)使用kNN算法改进约会网站的配对效果
最近边看NG老师的机器学习课程和西瓜书,无奈交织着各种数学推导,有些晦涩难懂,看到网上推荐了<machine learning in action>比较适合新手入门, 书中数据和源码在此 ...
- 使用k-近邻算法改进约会网站的配对效果
2.2 使用k-近邻算法改进约会网站的配对效果 Helen交往过三种类型的人: 不喜欢的人 魅力一般的人 极具魅力的人 示例:在约会网站上使用k-近邻算法 (1)收集数据:提供文本文件: dating ...
- 【机器学习】机器学习从零到掌握之三 -- 教你使用K近邻算法改进约会网站
本文是<机器学习从零到掌握>系列之第3篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 本篇使用的数据存放在文本文件datingTes ...
- 【机器学习实战】k-近邻算法案例——改进约会网站的配对效果
上一篇:k-近邻算法实战概述 文章目录 背景: 步骤: 准备数据:从文本文件中解析数据 分析数据:使用Matplotlib创建散点图 准备数据:归一化数值 测试算法:作为完整程序验证分类器 使用算法: ...
- 机器学习实战之K近邻算法
k近邻算法概述 简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类. 优 点 :精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. ...
- 【机器学习】机器学习从零到掌握之九 -- 教你使用K近邻算法形成完整系统
本文是<机器学习从零到掌握>系列之第9篇 机器学习从零到掌握之一 -- 教你理解K近邻算法 机器学习从零到掌握之二 -- 教你实现K近邻算法 机器学习从零到掌握之三 -- 教你使用K近邻算 ...
- 《机器学习实战》kNN算法及约会网站代码详解
使用kNN算法进行分类的原理是:从训练集中选出离待分类点最近的kkk个点,在这kkk个点中所占比重最大的分类即为该点所在的分类.通常kkk不超过202020 kNN算法步骤: 计算数据集中的点与待分类 ...
- 机器学习算法系列之K近邻算法
本系列机器学习的文章打算从机器学习算法的一些理论知识.python实现该算法和调一些该算法的相应包来实现. 目录 K近邻算法 一.K近邻算法原理 k近邻算法 通俗解释 近邻距离的度量 k值的选择 KN ...
最新文章
- hive函数 get_json_object的使用
- linux mysql 健康检查_Linux下检查MySQL的Slave是否正常
- 比亚迪高级驾驶辅助系统ADAS 即将推出
- shopeeLazada越南站点“热销品类”推荐
- 2016年成熟亚太地区公共云服务市场规模将达到81亿美元
- 【算法篇】八种内排序算法
- 修改自己的centos输入法
- 基础练习 高精度加法(蓝桥杯 java)
- 机智云产品、功能、服务一览表
- python21天打卡Day6-元组
- 达内学子商城项目简述(SSM+ecplise+tomcat8+mysql)
- 海康信号灯控制机服务器,交通信号控制硬件设备简介
- 诺基亚S40系统手机使用技巧大全(此乃刘某整理)
- 入手评测 锐龙r7 5825u和i5 1240p选哪个好
- 摄像头poe供电原理_poe供电模块原理图
- 手机归属地查询示例代码
- C语言算法:十进制转为二进制
- 文本数据可视化中一些概念
- 图像的平滑滤波、边缘检测、阈值化、腐蚀膨胀等原理介绍
- 《C语言编程魔法书:基于C11标准》——2.9 本章小结
热门文章
- scala写入mysql_Scala:读写文件
- python链表结构_CodeSalt | Python数据结构的实现 — 链表
- win7鼠标指针主题包_Windows10系统用键盘来代替鼠标操作的方法
- java 处理unicode_Java与Unicode
- 如何删除下一页分节符_word 2010高级应用:分节符的使用
- B4.Java web部分
- 计算机英语讲课笔记06
- Python编程基础21:GUI编程
- Java案例:读取XML文档
- android 打印流程图,Android实现Activities之间进行数据传递的方法