knn算法原理

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值