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, 惰性学习.
来源: http://www.bubuko.com/infodetail-3289549.html