1 import pandas as pd 2 import numpy as np 3 4 5 def build_data(): 6 """ 7 加载数据 8 :return: 9 """ 10 # 1、加载数据 11 data = pd.read_excel("./电影分类数据.xlsx") 12 13 return data 14 15 16 def distance(v1, v2): 17 """ 18 计算距离 19 :param v1:点1 20 :param v2: 点2 21 :return: 距离dist 22 """ 23 # 法1 24 # v1 是矩阵 将矩阵转化数组,再进行降为1维 25 # v1 = v1.A[0] 26 # print(v1) 27 # sum_ = 0 28 # for i in range(v1.shape[0]): 29 # sum_ += (v1[i] - v2[i]) ** 2 30 # dist = np.sqrt(sum_) 31 # print(dist) 32 # 法2 33 dist = np.sqrt(np.sum(np.power((v1 - v2), 2))) 34 return dist 35 36 37 def knn_owns(train, test, k): 38 """ 39 自实现knn算法 40 :param train:训练集 41 :param test: 测试集 42 :param k: 邻居个数 43 :return: None 44 """ 45 # 每一个测试样本需要与每一个的训练样本计算距离 46 # for i in range(train.shape[0]): 47 # distance(test[1:], train.iloc[i, 1:]) 48 for index in train.index: 49 dist = distance(test[1:].values, train.loc[index, "搞笑镜头":"打斗镜头"].values) 50 train.loc[index, "dist"] = dist 51 52 # 按照距离升序排序 53 res = train.sort_values(by="dist").head(k)["电影类型"].mode() 54 55 # print(train) 56 print(res) 57 58 59 def main(): 60 """ 61 主函数 62 :return: 63 """ 64 # 1、加载数据 65 data = build_data() 66 print("data:\n", data) 67 # 2、数据集拆分 68 # 训练集 69 train = data.iloc[:, 1:-4] 70 print("train_\n", train) 71 # 测试集 72 test = data.columns[-4:] 73 print("test_:\n", test) 74 # 2、自实现knn 75 # 指定k个邻居 76 k = int(input("请输入邻居个数:")) 77 # 邻居个数k 不同 结果不同 78 knn_owns(train, test, k) 79 80 81 if __name__ == '__main__': 82 main() 83 84 # 超参数: 人可以指定不同的值,来获取不同结果,k值在训练的过程中,不发生改变。 85 # 超参数调优:超参数调整与优化,---不停的去尝试不同值的超参数,来获取最好的结果,那么此时所对应的超参数就是最优的