枯木再生网

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

数据挖掘经典十大算法_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 npimport matplotlib.pyplot as pltfight = [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.5print(dist)

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

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

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

k = 4classCount = { } # 建立一个空的字典来统计每种类型出现的次数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 = valueprint('output:' , maxType)

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

import numpy as npdef 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 npimport matplotlib.pyplot as pltimport knn as Kfight = [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.Ty = np.array(filmtype)xx = np.array([18,90]) # 将测试数据转换为arrayresult = k.knn(xx,x,y,4)print(result)

未经允许不得转载:枯木再生网 » 数据挖掘经典十大算法_KNN算法