import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt
# 分析--》训练集里面 构建分类器模型
# ---在测试集里面进行应用,来评估分类器性能
# 加载数据
# def deal_data(dir_path):
# """
# 处理数据
# :param dir_path: 文件夹路径
# :return: None
# """
# # 查看文件夹都有哪些文件
# file_list = os.listdir(dir_path)
# file_num = len(file_list)
# # print(file_list)
# # print(file_num)
# data = np.zeros((file_num, 1025))
# for index, file_name in enumerate(file_list):
# # print(file_index)
# # print(file_name)
# # 拼接文件路径加名称
# file_path = dir_path + '/' + file_name
# # print(file_path)
# file_data = np.loadtxt(file_path, dtype=str)
# # print(file_data)
# arr_data = np.zeros((32, 32))
# for file_index, file_cont in enumerate(file_data):
# # print(file_index,file_cont)
# arr = np.array(list(map(int, file_cont)))
# # print(arr)
# arr_data[file_index] = arr
# # print(arr_data)
# # print(arr_data)
# arr_ravel = arr_data.ravel() # (1,1024)数据
#
# # 将展开的数据放置到data的第index行的前1024列
# # 每一行特征值
# data[index, :-1] = arr_ravel
# # 处理每一行的目标值
# data[index, -1] = file_name.split('_')[0]
# # print(data)
# # print(data.shape)
# # 进行保存文件
# name = dir_path[2:]
# np.savetxt("./" + name + '.csv', data, fmt='%d')
#
#
# deal_data('./trainingDigits')
# deal_data('./testDigits')
def distance(v1, v2):
"""
距离计算
:param v1: 点v1
:param v2: 点v2
:return: dist两点间距离
"""
dist = np.sqrt(np.sum(np.power(v1-v2, 2)))
return dist
def knn(train, test, k):
"""
进行knn算法实现
:param train: 训练集
:param test: 测试集
:param k: 前k个数据
:return: score 准确率
"""
# 进行距离计算
# 循环计算每一个训练集的样本与测试集样本之间的距离
true_num = 0
# 测试集样本与每一个训练集样本之间的距离
for i in range(test.shape[0]): # 每一个i代表每一行训练集样本
dist_list = []
for j in range(train.shape[0]): # 每一个训练集样本
# test[i, :-1] 第i个测试样本的特征值
# train[j, :-1] 第j个训练集样本的特征值
dist = distance(test[i, :-1], train[j, :-1])
dist_list.append(dist)
sort_index = np.array(dist_list).argsort()[:k]
# 进行求取众数
mode = pd.DataFrame(train[sort_index, -1]).mode()[0][0]
print('预测第{}行数据为:'.format(i), mode)
if mode == test[i, -1]:
true_num += 1
print(true_num)
# 计算准确率
score = true_num / test.shape[0]
return score
def show_res(score_list, k_list):
"""
进行结果展示
:param score_list: 准确率列表
:param k_list: k值列表
:return:
"""
plt.figure()
# 准备x数据,准备y数据
x = range(len(k_list))
y = score_list
# 进行绘制
plt.plot(x, y, marker='*', markersize='12')
plt.xticks(x, k_list)
plt.title("准确率随着k值变化趋势")
plt.show()
# 进行knn算法自实现
train = np.loadtxt('./trainingDigits.csv', dtype=int)
test = np.loadtxt('./testDigits.csv', dtype=int)
score_list = []
k_list = []
for k in range(5, 10):
k_list.append(k)
score = knn(train, test, k)
score_list.append(score)
print(score_list)
# 进行结果展示
show_res(score_list, k_list)
knn算法原理
最新推荐文章于 2020-06-20 15:56:24 发布