数据挖掘经典十大算法_KNN算法

数据挖掘经典十大算法_KNN算法

一、从案例入手
已知一组数据:

电影名称亲热次数打斗次数电影类型
California Man1043爱情电影
He is Not Really into Dudes1002爱情电影
Beautiful Woman811爱情电影
Kevin Longblade10101动作电影
Robo Slayer 3000599动作电影
Amped Ⅱ298动作电影
未知9018

(一)划分训练集与测试集
训练集

电影名称亲热次数打斗次数电影类型
California Man1043爱情电影
He is Not Really into Dudes1002爱情电影
Beautiful Woman811爱情电影
Kevin Longblade10101动作电影
Robo Slayer 3000599动作电影
Amped Ⅱ298动作电影

测试集

电影名称亲热次数打斗次数电影类型
未知9018

(二)计算未知样本和每个训练集样本的距离(欧氏距离)
dist(x,y) =
(三)设定参数,k值
设定K = 3
(四)将距离升序排列
1.Beautiful Woman
2.He is Not Really into Dudes
3.California Man
4.Kevin Longblade
5.Robo Slayer 3000
6.Amped Ⅱ
(五)选取距离最小的k个点
1.Beautiful Woman
2.He is Not Really into Dudes
3.California Man
(六)统计前k个最近邻样本点所在类别出现的次数
爱情电影 3次 动作电影 0 次
(七)选择出现频率最大的类别作为未知样本的类别
未知电影 为 爱情电影类型
二、从程序理解
(一)导入训练数据

import numpy as np
import matplotlib.pyplot as plt
fight = [3,2,1,101,99,98]
kiss = [104,100,81,10,5,2]
filmtype = [1,1,1,2,2,2]
plt.scatter(fight,kiss,c=filmtype)
plt.xlabel('fight')
plt.ylabel('kiss')
plt.title('movie')
plt.show()
x = np.array([fight,kiss])
x = x.T # 转置
y = np.array(filmtype)
print(x)
print(y)

在这里插入图片描述
x 转置后的矩阵,每一行代表一条数据样本
在这里插入图片描述
y 矩阵
在这里插入图片描述
(二)计算测试数据与训练数据的欧氏距离

xx = np.array([18,90]) # 将测试数据转换为array
# 计算欧氏距离 
# sum(0) 按列求和 sum(1)按行求和 由于前面将矩阵进行转置 所以每一行代表一条样本
dist = (((x-xx)**2).sum(1))**0.5
print(dist)

在这里插入图片描述
(三)将距离升序排序

sortedDist = dist.argsort()
print(sortedDist) # 输出的是排序索引

在这里插入图片描述
(四)设置K值,选取距离最小的k个点,统计前k个点所在类别出现的次数

k = 4
classCount = {} # 建立一个空的字典来统计每种类型出现的次数
for i in range(k):
    voteLabel = y[sortedDist[i]] # 利用排序索引映射到y矩阵中,获得索引对应的电影类型
    classCount[voteLabel] = classCount.get(voteLabel,0) + 1 # 利用get函数取键值 并在基础上加1达到计数效果  累加操作
print('class:count',classCount)

在这里插入图片描述
(五)多数表决,输出结果

maxType = 0 # 设置初始值
maxCount = -1 # 设置初始值
for key , value in classCount.items(): # items() 遍历字典
    if value > maxCount: 
        maxType = key
        maxCount = value
print('output:' , maxType)

在这里插入图片描述
三、封装KNN程序

import numpy as np
def knn(inX,dataSet,labels,k):
    dist = (((dataSet-inX)**2).sum(1))**0.5
    sortedDist = dist.argsort()
    classCount = {}
    for i in range(k):
        voteLabel = labels[sortedDist[i]] # 利用排序索引映射到y矩阵中,获得索引对应的电影类型
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1 # 利用get函数取键值 并在基础上加1达到计数效果
    maxType = 0 # 设置初始值
    maxCount = -1 # 设置初始值
    for key , value in classCount.items(): # items() 遍历字典
        if value > maxCount: 
            maxType = key
            maxCount = value
    return maxType
import numpy as np
import matplotlib.pyplot as plt
import knn as K
fight = [3,2,1,101,99,98]
kiss = [104,100,81,10,5,2]
filmtype = [1,1,1,2,2,2]
x = np.array([fight,kiss])
x = x.T
y = np.array(filmtype)
xx = np.array([18,90]) # 将测试数据转换为array
result = k.knn(xx,x,y,4)
print(result)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敷衍zgf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值