KNN实例1

  一、需求:

      一个简单的KNN代码实现:通过已知电影中打斗次数和接吻次数将电影划分为爱情电影与动作电影,预测测试电影属于哪一类电影。

二、代码实现:

代码用python实现,见注释。

import numpy as np
import  matplotlib.pyplot as plt
# 打斗次数
fight=(5,2,1,105,97,98)
# 接吻次数
kiss=(114,101,80,11,5,3)
# 爱情电影1,动作电影2
filmtype=(1,1,1,2,2,2)
plt.scatter(fight,kiss,c=filmtype)
plt.xlabel('fight')
plt.ylabel('kiss')
plt.title('movie')
# 打斗次数和接吻次数合并为输入
x=np.array([fight,kiss])
# 输出电影类型
y=np.array(filmtype)
# 矩阵转置,每一行代表一条数据样本
x=x.T
print(x)
print(y)
plt.show()
# 测试数据
xx=np.array([18,90])
# 按行求和,计算未知样本和每个训练集样本的距离
dist=(((x-xx)**2).sum(1))**0.5
print(dist)
#使用argsort()函数 将距离按索引升序排列,获取排序后的索引值
sortedDist=dist.argsort()
print(sortedDist)
# 选取距离最小的K个点,统计前K个点所在类别出现的次数
k=4
# 定义一个空字典.voteLabel存放key值,get函数取value值
classCount={}
for i in range(k):
    voteLabel=y[sortedDist[i]]
    classCount[voteLabel]=classCount.get(voteLabel,0)+1
print(classCount )
# 根据多数表决,输出结果
maxType=0
maxCount=-1
# 遍历字典
for key,value in classCount.items():
    if value>maxCount:
        maxType=key
        maxCount=value
print(maxType)

三、优化代码,封装成KNN:

将上面算法相关代码封装成knn模块:

"""
函数说明:
inx:测试集
dataSet:训练集
labels:标签
k:选取的距离最小的K个点
返回值:maxType-分类结果
"""
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]]
        classCount[voteLabel]=classCount.get(voteLabel,0)+1
    maxType=0
    maxCount=-1
    for key,value in classCount.items():
        if value>maxCount:
            maxType=key
            maxCount=value
    return maxType

调用模块代码:

import numpy as np
import  matplotlib.pyplot as plt
import knn as k
# 打斗次数
fight=(5,2,1,105,97,98)
# 接吻次数
kiss=(114,101,80,11,5,3)
# 爱情电影1,动作电影2
filmtype=(1,1,1,2,2,2)
plt.scatter(fight,kiss,c=filmtype)
plt.xlabel('fight')
plt.ylabel('kiss')
plt.title('movie')
# 打斗次数和接吻次数合并为输入
x=np.array([fight,kiss])
# 输出电影类型
y=np.array(filmtype)
# 矩阵转置,每一行代表一条数据样本
x=x.T
print(x)
print(y)
plt.show()
# 测试数据
xx=np.array([18,90])
#调用模块
result=k.knn(xx,x,y,4)
print('result=',result)

三、运行结果:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值