k近邻算法--约会网站预测案例

本文详细介绍了使用k近邻算法进行约会网站配对预测的案例。通过构建分类器,数据解析,归一化处理,以及错误率测试,最终实现了一个完整的系统。案例中,数据包括飞行里程、玩游戏时间占比和冰淇淋消费量,通过计算距离找到最接近的k个样本,以确定新数据的分类。
摘要由CSDN通过智能技术生成

k近邻算法总结

一、判断分类的方法
采用测量不同特征值之间的距离方法进行分类。
给定一个有特征值和已知分类标签的样本数据集,将新的特征数据与样本数据进行距离比较,选出距离最近的前k个数据的分类标签,再在这些标签中选出频率最高的,作为新数据的的分类。

二、距离怎么算
常用欧式距离曼哈顿距离
1)欧式距离:用于计算两点或多点之间的距离。
在这里插入图片描述
缺点:它将样本的不同属性(即各指标或各变量量纲)之间的差别等同看待,这一点有时不能满足实际要求。比如年龄和学历对工资的影响,将年龄和学历同等看待;收入单位为元和收入单位为万元同等看待。
标准化欧式距离,将属性进行标准化处理,区间设置在[0,1]之间,减少量纲的影响。(归一化处理)
2)曼哈顿距离:欧式几何空间两点之间的距离在两个坐标轴的投影。
在这里插入图片描述
三、K近邻算法的优缺点
1、缺点:k-近邻算法必须保存全部数据集,如果训练数据集的很大,必须使用大量的存储空间。此外,由于必须对数据集中的每个数据计算距离值,实际使用时可能非常耗时;另一个缺陷是它无法给出任何数据的基础结构信息,因此我们也无法知晓平均实例样本和典型实例样本具有什么特征。
2、优点:精度高、对异常值不敏感、无数据输入假定

四、适用数据范围:数值型和标称型

案例------约会网站配对预测

案例背景:
卡特琳娜一直在使用约会网站寻找适合自己的约会对象。尽管约会网站会给她推荐不同的人选,但她并不是喜欢每一个人。经过一番总结,她发现她曾经交往过三种类型的人:
1)不喜欢的人
2)魅力一般的人
3)极具魅力的人

尽管发现了这样的规律,但是卡特琳娜还是没办法及那个网站推荐的人分类,这可把她给愁坏了!所以,她找到我们,希望我们可以写一个分类软件,来帮助她将匹配对象划分到确切的分类中。
卡特琳娜提供给我们一个txt文件,叫做datingSet.txt,其中每个样本占一行,总共有1000行。每个样本主要包括以下三个特征:
1)每年获得的飞行常客里程数
2)玩视频游戏所耗时间百分比
3)每周消费的冰淇淋公升数

整体思路:
1、准备数据:解析文本文件(KNN.py中添加file2matrix函数)
2、分析数据:Matplotlib画二维散点图
3、构造分类器:计算新数据点与样本数据中各点的距离,取距离最小的前K个点,找出其对应的分类标签,再在这些标签总找出频率最高的分类标签,作为新数据点的分类。(KNN.py中添加classify0函数)
4、归一化处理:剔除数值绝对大小的规模因素。如将取值范围处理为0到1或者-1到1之间。(KNN.py中添加autoNorm函数)
5、测试算法:将样本数据中的10%作为测试数据,将计算出来的分类与它本身的label进行对比,评估错误率。(KNN.py中添加datingClassTest函数)
6、构建完整可用系统

一、构造一个简单的分类器

创建一个KNN.py文件,内容:


from numpy import *
import operator

def createDataSet():
    group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels=list('AABB')
    return group,labels'''
import kNN
---------------------------------------------------------------------------

ModuleNotFoundError                       Traceback (most recent call last)

<ipython-input-2-56f5ad88be8d> in <module>
----> 1 import kNN


ModuleNotFoundError: No module named 'kNN'
import sys
sys.path.append("D:/") #添加模块搜索路径
import KNN
group,labels=KNN.createDataSet()
group
array([[1. , 1.1],
       [1. , 1. ],
       [0. , 0. ],
       [0. , 0.1]])
labels
['A', 'A', 'B', 'B']
group.shape
(4, 2)

构造分类函数:

'''增加文件KNN.py内容:
def classify0(inX,dataSet,labels,k):   
    dataSetsize=dataSet.shape[0]
    diffMat=tile(inX,(dataSetsize,1))-dataSet 
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1)
    distances=sqDistances**0.5
    sortedDisIndicies=distances.argsort()
    classCount={}
    for i in range(k):
        voteIlabel=labels[sortedDisIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
    sortedClassCount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]'''

classify0()函数的意义:将新数据与样本数据进行距离对比,找出前k个距离最近的样本点, 再找出这些样本点对应分类频率最大的一个,作为新数据的分类

以下为函数中每行代码的测试:

KNN.classify0([1,2],group,labels,3) 
#group是已知类别的训练样本集,group中每个元素对应类别在lables中。想知道[1,2]这个向量(数据点)的类型
'A'
dataSetsize=group.shape[0] 
diffMat=KNN.tile([1,2],(dataSetsize,1))-group
diffMat# 向量数据与已知类别数据group的每个数据点的差
array([[0. , 0.9],
       [0. , 1. ],
       [1. , 2. ],
       [1. , 1.9]])
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
distances  #向量数据与已知类别数据group的每个数据点的距离:差的平方和再开方(欧式距离公式)
array([0.9       , 1.        , 2.23606798, 2.14709106])
sortedDisIndicies=distances.argsort()# 各距离从小到大排序的索引器
sortedDisIndicies 
array([0, 1, 3, 2], dtype=int64)
# 各距离从小到大排序后,取对应训练样本集中离新数据最近的前3个数据点,计算这三个数据点对应分类的个数,看哪个分类的出现频率最大:
classCount={
   }
for i in range(3): # k=3
    voteIlabel=labels[sortedDisIndicies[i]] #labels=['A', 'A', 'B', 'B']
    classCount[voteIlabel]=classCount.get(voteIlabel,0)+1
classCount 
{'A': 2, 'B': 1}
classCount.items()
dict_items([('A', 2), ('B', 1)])

看哪个分类的出现频率最大,结果是A,则以A作为新数据的类型:

sortedClassCount=sorted(classCount.items
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值