KNN算法的python的简单实现
*以下是knn实现的课程作业,由于编码水平有限,有些不合理的地方请批评指正
选择从网上下载的水果数据集,将其中的三分之二作为训练数据,其中的三分之一作为测试数据。分别放入两张表中,训练集和测试集的数据结构均相同如下图:
#导入第三方库
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#载入训练集
train = pd.read_csv(r'C:\Users\17749\Desktop\空间数据挖掘\train.csv')
train
#载入测试数据,通过mass、width、height、color四个参数来预测水果类型,选择测试集和训练集的这四个参数进行计算
train_cal = train.drop(['fruit_name','fruit_subtype'],axis=1)
test = pd.read_csv(r'C:\Users\17749\Desktop\空间数据挖掘\test.csv')
test_cal = test.drop(['fruit_name','fruit_subtype'],axis=1)
test_cal.head()
#定义欧式距离计算函数
def dis(ls1,ls2):
sum = 0
for i,j in zip(ls1,ls2):
sum += pow((i-j),2)
distance = pow(sum,1/2)
return distance
#预设K值,设计函数获取每个测试集的每个预测标签
def predict_label(ls,k=8):
train['distance']='' #新建距离字段
for i in range(len(train_cal)):
train_ls = list(train_cal.iloc[i,1:])
disance = dis(ls,train_ls)
train[i,-1]=disance
train.sort_values(by=['distance'],inplace=True,ascending=True) #按照距离升序排序
k_neighbor = train.iloc[:k-1,:] #选择距离最近的前k个记录放入k_neighbor表
#对k_neighbor表中的标签进行计数
k_neighbor_label = pd.DataFrame(k_neighbor['fruit_label'].value_counts(ascending=False))
#返回出现次数最多的标签
label = k_neighbor_label.index.values[0]
train.drop(['distance'],axis=1,inplace=True)
return label
#计算测试集中每个样本的标签,写入predict_label中
test['predict_label']='' #初始化predict_labe
for i in range(len(test_cal)):
test_ls = list(test_cal.iloc[i,1:])
test.iloc[i,-1]=predict_label(test_ls,5)
#计算准确度
correct = 0
for i in range(len(test)):
if test.iloc[i,0]==test.iloc[i,-1]:
correct += 1
acc = correct/len(test)
acc
最后准确度为24%,可能与样本中个标签的类别数量差异有关