k近邻算法-3.算法应用

旧城等待, 2023-08-17 16:44 45阅读 0赞

算法具体应用

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import matplotlib
  4. from sklearn import datasets

加载手写数据集

  1. digits = datasets.load_digits() #加载手写数据集

1465169-20190713094406085-1686757288.png

手写数据集共有5620个样本,每个样本有64个特征,为手写数据集的像素点,其样本的结果为0-9的手写数字,其数据集描述如下:
1465169-20190713094418685-387920369.png

样本结构:
1465169-20190713094458604-2118026381.png

数据可视化,查看某个样本的特征和结果:

  1. x =digits.data
  2. y = digits.target
  3. # 数据集中第222个样本
  4. some_digit = x[222]
  5. #一个手写数字有64个特征,将一维数组的特征变为8*8的矩阵
  6. some_digit_image = some_digit.reshape(8, 8)
  7. plt.imshow(some_digit_image, cmap=matplotlib.cm.binary)
  8. plt.show()

1465169-20190713094551697-2055952211.png

查看此数据的结果:
1465169-20190713094603684-1524186202.png

封装之前的代码,实现手写数据集的预测

定义K近邻算法(KNN.py):

  1. import numpy as np
  2. from math import sqrt
  3. from collections import Counter
  4. class KNNClassifier:
  5. """docstring for KNNClassifier"""
  6. def __init__(self, k):
  7. """初始化KNN分类器"""
  8. assert k >= 1, 'k must be valid'
  9. self.k = k
  10. self._x_train = None
  11. self._y_train = None
  12. def fit(self, _x_train, _y_train):
  13. """根据训练数据集训练KNN分类器"""
  14. self._x_train = _x_train
  15. self._y_train = _y_train
  16. # 返回对象本身(高级操作)
  17. return self
  18. def predict(self,x_predict):
  19. """给定待测试的数据集x_predict,返回结果向量"""
  20. assert self._x_train is not None and self._y_train is not None, \
  21. "must fit before predict!"
  22. assert self._x_train.shape[0] == self._y_train.shape[0], \
  23. "the size of x_train must equal to the size of y_train"
  24. assert self._x_train.shape[1] == x_predict.shape[1], \
  25. "the feature number of x must be equal to x_train"
  26. y_predict = [self._predict(x) for x in x_predict]
  27. return np.array(y_predict)
  28. def _predict(self, x):
  29. """给定单个的待测数据x,返回x的预测结果"""
  30. assert self._x_train.shape[1] == x.shape[0], \
  31. "the feature number of x must be equal to x_train"
  32. #求出一个预测的数据 和 每个数据集的距离,是一个无序列表
  33. distances = [sqrt(np.sum((x_train -x) ** 2)) for x_train in self._x_train]
  34. #根据索引排序
  35. nearest = np.argsort(distances)
  36. #找出距离此新样本最近的k个原始样本的结果
  37. topK_y = [self._y_train[i] for i in nearest[:self.k]]
  38. #统计数组中的元素,及它出现的次数
  39. votes = Counter(topK_y)
  40. #找到票数最多的n个元素 ,按票数从多到少 排序 [(元素,票数)]
  41. return votes.most_common()[0][0]
  42. def __repr__(self):
  43. return 'KNN(k=%d)'%self.k

定义模型选择库(model_selection.py)

  1. import numpy as np
  2. #训练 测试数据集分离
  3. def train_test_split(x, y, test_ratio=0.2, seed=None):
  4. assert x.shape[0] == y.shape[0],\
  5. "the size of x must be equal to the size of y"
  6. assert 0.0 <= test_ratio <= 1.0,\
  7. "test_ratio must be valid"
  8. if seed:
  9. np.random.seed(seed)
  10. shuffle_index = np.random.permutation(len(x))
  11. test_size = int(len(x) * test_ratio)
  12. test_index = shuffle_index[:test_size]
  13. train_index = shuffle_index[test_size:]
  14. x_train = x[train_index]
  15. x_test = x[test_index]
  16. y_train = y[train_index]
  17. y_test = y[test_index]
  18. return x_train, x_test, y_train, y_test

使用自己封装的库:

  1. from mylib.model_selection import train_test_split
  2. from mylib.KNN import KNNClassifier
  3. x_train,x_test,y_train,y_test = train_test_split(x, y,test_ratio=0.2)
  4. my_clf = KNNClassifier(k=3)
  5. my_clf.fit(x_train,y_train)
  6. y_predict = my_clf.predict(x_test)

验证算法的准确率:

  1. score = numpy.sum(y_predict==y_test)/len(y_test)

1465169-20190713094640329-622572258.png

封装,实现解耦:

  1. # metrics.py (metrics 意为衡量标准)
  2. import numpy
  3. import math
  4. def accuracy_score(y_true, y_predict):
  5. '''计算准确率'''
  6. assert y_true.shape[0] == y_predict.shape[0], \
  7. "size of y_true must be equal to the size of y_predict"
  8. return numpy.sum(y_true == y_predict)/len(y_true)
  9. # KNN.py 添加求准确率方法
  10. from .metrics import accuracy_score
  11. def score(self,x_test,y_test):
  12. y_predict = self.predict(x_test)
  13. return accuracy_score(y_test, y_predict)

转载于:https://www.cnblogs.com/shuai-long/p/11179490.html

发表评论

表情:
评论列表 (有 0 条评论,45人围观)

还没有评论,来说两句吧...

相关阅读

    相关 K近邻算法

    一、kNN算法的工作原理 官方解释:存在一个样本数据集,也称作训练样本集,并且样本中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系,输入没有标签的新数据后

    相关 k近邻算法matlab实现_k近邻算法

    k 近邻法 (k-NN) 是一种基于实例的学习方法,无法转化为对参数空间的搜索问题(参数最优化 问题)。它的特点是对特征空间进行搜索。除了k近邻法,本章还对以下几个问题进行较深

    相关 k-近邻算法

    从今天开始,与大家分享我学习《Machine Learning In Action》这本书的笔记与心得。我会将源码加以详细的注释,这是我自己学习的一个过程,也是想通过这种方式帮

    相关 K近邻分类算法

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似

    相关 K-近邻算法(KNN)

         拜读大神的系列教程,大神好像姓崔(猜测),大神根据《机器学习实战》来讲解,讲的很清楚,读了大神的博客后,我也把我自己吸收的写下来,可能有很多错误之处,希望拍砖(拍轻点

    相关 knn(k近邻算法

    一、什么是knn算法 knn算法实际上是利用训练数据集对特征向量空间进行划分,并作为其分类的模型。其输入是实例的特征向量,输出为实例的类别。寻找最近的k个数据,推测新数据...