机器学习:KNN算法Python实现

  KNN(K-Nearest Neighbor) K 近邻算法,K近邻就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。KNN算法用于监督学习分类模型,预测结果是离散的机器学习算法。

  KNN算法原理:

  1、计算每个测试数据与每个训练数据的距离(相识度);

  2、按照距离升序,对训练集数据进行排序;

  3、获取距离最近的k个邻居,获取这k个邻居中的众数(取其中一个就行);

  4、测试样本的预测结果就取众数的目标值。

  

  KNN算法Python:手写数字案例

  手写字为0,1构成的数字,为txt文件,首先我们将txt文件读取处理,32*32 展开成1024个特征值,txt文件名(7_151.txt)部分为目标值。

  这样我们就可以构成训练集,测试集。

  手写数字txt文件,读取,并以numpy.ndarray的形式分别存为train.npy, test.npy。

import numpy as np
import os


def build_data(file_path):
    """
    加载手写数字数据,转为numpy.ndarray
    :param file_path: 文件路径
    :return: data_arr 保存后的np.narray
    """
    file_name_list = os.listdir(file_path)
    data_arr = np.zeros(shape=(len(file_name_list), 1025))
    for file_index, file_name in enumerate(file_name_list):
        file_content = np.loadtxt(file_path + '/' + file_name, dtype=np.str)
        file_str = ''.join(file_content)
        data_arr[file_index, : 1024] = [int(s) for s in file_str]
        data_arr[file_index, -1] = int(file_name.split('_', 1)[0])
    return data_arr


def save_file(file_path, data):
    """
    保存训练集、测试集数据
    :param file_path: 文件路径
    :param data: 要保存的数据
    :return: None
    """
    if not os.path.exists('./data'):
        os.makedirs('./data')
    np.save('./data/' + file_path, data)
    print("{}保存成功!".format('./data/' + file_path + '.npy'))


def main():
    train = build_data('./trainingDigits')
    test = build_data('./testDigits')

    print(train)
    print(train.shape)
    print(test)
    print(test.shape)
    save_file('train', train)
    save_file('test', test)


if __name__ == '__main__':
    main()

  

  加载数据

 

  数据集、测试集,前1024列为特征值,最后一列为目标值。实现knn算法

 

  score_list 对应k_list的准确率,k值不同,准确率不同。结果展示

  KNN算法的优点:

  1、非常简单的分类算法没有之一,人性化,易于理解,易于实现;

  2、适合处理多分类问题,比如推荐用户;

  3、可用于数值型数据和离散型数据,既可以用来做分类也可以用来做回归;

  4、对异常值不敏感。

  KNN算法的缺点:

  1、时间复杂度,空间复杂度高;

  2、k值不同,预测结果会不同;

  3、惰性学习。

 

猜你喜欢

转载自www.cnblogs.com/bestwishfang/p/11869993.html