为什么要写这样的一个小例子呢?原因是大多数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)