单身狗掐指一算:k邻近(KNN)算法举例

为什么要写这样的一个小例子呢?原因是大多数blog给的例子都没有很好的发挥python的威力,

使用了一些for循环,这在数据量很大的情况下,会运行较慢

练习的例子就是根据kiss次数和打斗次数来预测电影的分类

import pandas as pd
import numpy as np
from pandas import DataFrame, Series

'''
    二:KNN算法的一般流程
    1)计算测试数据与各个训练数据之间的距离;

    2)按照距离的递增关系进行排序;

    3)选取距离最小的K个点;

    4)确定前K个点所在类别的出现频率;

    5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
'''


def knn(training_set, test_data, k):
    '''
        :param training_set:  已知分类训练数据 DataFrame类型
        :param test_data: 待测试数据  Series类型
        :param k: k值   int类型
        :return: 返回电影分类 string类型
    '''
    # 1)计算测试数据与各个训练数据之间的距离;
    index = training_set["movie_type"]
    subtract = training_set[["fight_count", "kiss_count"]] - test_data
    result = np.sqrt(subtract["fight_count"] ** 2 + subtract["kiss_count"] ** 2)
    result.index = index

    # 2)按照距离的递增关系进行排序;
    result = result.sort_values()
    print("按照距离的递增关系进行排序", result)

    # 3)选取距离最小的K个点;
    if k < len(result):
        result_k = result[:k]
    else:
        raise Exception("k的值超过训练数据的长度")

    # 4)确定前K个点所在类别的出现频率;
    # 5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
    grouped = result_k.groupby(result_k.index).count()
    grouped = grouped.sort_values(ascending=False)
    return grouped.index[0]


if __name__ == "__main__":
    training_set = DataFrame([[3, 104, "love film"],
                              [2, 100, "love film"],
                              [1, 81, "love film"],
                              [101, 10, "action film"],
                              [99, 5, "action film"],
                              [98, 2, "action film"],
                              [10, 90, "love film"],
                              [20, 50, "love film"]],
                             columns=["fight_count", "kiss_count", "movie_type"])
    test_data = Series([90, 70], index=["fight_count", "kiss_count"])
    k = 3
    unknown_type = knn(training_set, test_data, k)
    print(unknown_type)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值