《机器学习实战》笔记:KNN算法

1、KNN算法介绍

KNN全称K-Nearest Neighbor,K-近邻算法。它是一种分类算法,通过测量不同特征值之间的距离进行分类。

优点:精度高、对异常值不敏感、无数据输入假定

缺点:计算复杂度高、空间复杂度高

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

2、KNN算法实现步骤

  • 计算测试数据与训练集之间的欧式距离(distance = sqrt(a-x1)**2 + (b-y1)**2) 
  • 将距离distance从小到大排序
  • 取前K个距离最小值,并统计这些数据的类别出现次数
  • 次数最大的那个类别作为被测数据的类别

3、算法实现

import numpy as np
import operator
from matplotlib.font_manager import FontProperties
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
import time

def createDataSet():
    '''
    函数说明:创建数据集
    :return:
        group: 数据集
        labels:分类标签
    '''
    # 创建四组二维特征(打斗镜头、接吻镜头)
    group = np.array([[1, 101], [5, 89], [108, 5], [115, 8]])
    labels = ["爱情片", "爱情片", "动作片", "动作片"]
    return group, labels


def classify0(inx, dataSet, labels, k):
    '''
    函数说明:k近邻算法
    :param inx: 测试集
    :param dataSet: 训练集
    :param labels: 训练集对应的标签
    :param k: 选取k个值
    :return: sortClassify[0][0] 测试集对应的类别
    '''
    # 获取训练集的个数
    number = dataSet.shape[0]
    # 将测试的点扩展,并与训练集作差值
    diffVal = np.tile(inx, (number, 1)) - dataSet
    # 求距离 sqrt(x**2+y**2)
    squareDiffVal = diffVal**2
    sumDiffVal = squareDiffVal.sum(axis=1)
    distance = sumDiffVal**0.5
    # argsort()函数返回距离从小到大的索引值
    sortIndex = distance.argsort()
    # 前k个距离最小的值的字典
    # 键:类别  值:类别对应的数量
    classifyDict = {}
    for i in range(k):
        # 前k个数据对应的标签
        dataLabel = labels[sortIndex[i]]
        # classifyDict.get(dataLabel, 0) 当dataLabel标签不存在时,返回0值;若存在,则这个dataLabel键对应的值
        classifyDict[dataLabel] = classifyDict.get(dataLabel, 0) + 1

    # 按照值对classifyDict进行排序 operator.itemgetter(1)按照值进行排序 reverse=True 从大到小排序
    sortClassify = sorted(classifyDict.items(), key=operator.itemgetter(1), reverse=True)
    return sortClassify[0][0]

if __name__=="__main__":
    dataSet, labels = createDataSet()
    inx = [92, 2]
    classInx = classify0(inx, dataSet, labels, 3)
    print(classInx)

# 结果
# ‘动作片’

 4、一点点感想

KNN算法是比较简单的分类算法,仅通过欧式距离来进行分类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值