【机器学习】KNN近邻算法

本文深入探讨了机器学习中的KNN(K-Nearest Neighbors)算法,详细解释了其工作原理,包括距离度量、K值选择及其对结果的影响。同时,介绍了KNN在分类和回归问题上的应用实例,探讨了优缺点及实际使用中的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

import numpy as np
import time
# from perception import data_load

def data_load(filename):
    '''
    :param filename:
    :return: dataArr,labelArr
    '''
    print('start read file')
    dataArr,labelArr = [],[]
    with open(filename,'r') as f:
        lines = f.readlines()
    for line in lines:
        line = line.strip().split(',')

        if int(line[0]) >= 5:
            labelArr.append(1)
        else:
            labelArr.append(-1)

        dataArr.append([int(num)/255 for num in line[1:]])
    print('End')
    return dataArr,labelArr

def cal_distance(x1,x2):
    '''

    :param x1:
    :param x2:
    :return: 两点之间的欧式距离
    '''
    x1 = np.array(x1)
    x2 = np.array(x2)
    return np.sqrt(np.sum(np.square(x1-x2)))

def knn(traindata,trainlabel,x,k):
    '''

    :param traindata: 训练集的数据
    :param trainlabel: 训练集的标签
    :param x: 目标点
    :param k: k近邻的k
    :return: 目标点的预测标签
    '''
    dis_list = []
    for i in range(len(traindata)):
        dis_list.append(cal_distance(traindata[i],x))

    #sort
    klist = np.argsort(np.array(dis_list))[:k]
    klist_label = [trainlabel[key] for key in klist]
    klabel = [klist_label.count(key) for key in list(set(klist_label))]

    return list(set(klist_label))[np.argsort(np.array(klabel))[-1]]

def model_test(traindata,trainlabel,testdata,testlabel,k):
    sum = len(traindata)
    rigSum = 0
    # for i in range(len(testdata)):
    for i in range(200):
        print('iter:{}'.format(i))
        y_pred = knn(traindata,trainlabel,testdata[i],k)
        if testlabel[i] == y_pred:
            rigSum += 1

    return rigSum/200*100

if __name__ == '__main__':
    k = 25
    traindata,trainlabel = data_load('dataset/mnist_train.csv')
    testdata,testlabel = data_load('dataset/mnist_test.csv')
    start = time.time()
    print(model_test(traindata,trainlabel,testdata,testlabel,k))
    end = time.time()
    print('训练时间:{}'.format(end-start))

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值