K临近算法(knn算法)

python语言,vscode工具。

一、k临近算法概述

1.1 k是什么,k指的是距离目标最近的k个实例

1.2 k近邻算法

采用不测量不同特征值之间的距离方法进行分类。

k近邻算法的优缺点:

  • 优点:精度高、对异常值不敏感、五数据输入假定。
  • 缺点:计算复杂度高、空间复杂度高。
  • 适用数据范围:数据型和标称型。

算法的计算公式

1.3

计算公式为欧式距离公式

 d= \sqrt{(xA_0-xB_0)^{2}+(xA_1-xB_1)^{2}}

 二、knn实现

已经对算法进行了了解并且拥有了计算公式,我们便可以找例子来开始实现。

影片名称打斗镜头次数亲吻镜头次数电影类型
少林足球903动作片
果宝特攻1095动作片
变形金刚982动作片
callmebyyourname680爱情片
逃学威龙892爱情片
逃学威龙2478  爱情片
逃学威龙3787动作片


from matplotlib import pyplot as plt
from numpy import *
import operator


def createDataSet():
    group = array([[90, 3], [109, 5], [98, 2], [6, 80], [8, 92], [4, 78],[78,7]])
    labels = ['动作片', '动作片', '动作片', '爱情片', '爱情片', '爱情片','动作片']
    return group, labels


def classifyKNN(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
    sortedDistIndicies = distances.argsort()
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]


def data_show(in_data, train_data):
    x = []
    y = []
    for i in range(train_data.shape[0]):
        x.append(train_data[i][0])
        y.append(train_data[i][1])
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False
    plt.plot(x, y, "*")
    plt.xlabel("打斗镜头出现次数")
    plt.ylabel("接吻镜头出现次数")
    plt.plot(in_data[0], in_data[1], "r*")
    plt.show()


if __name__ == '__main__':
    group, labels = createDataSet()
    # 测试集
    test = [97, 4]
    # kNN分类
    test_class = classifyKNN(test, group, labels, 3)
    # 打印分类结果
    print('该电影类型为' + test_class)
    data_show(test, group)

实现了运行

 总结

          knn算法可以处理分类问题并且算法简单易懂而且可以免去训练过程,但效率低,每一次分类都要对训练数据进行计算,有时准确性也不高
          
           
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值