思路:空间上距离相近的点具有相似的特征属性。

执行流程:

  •1. 从训练集合中获取K个离待预测样本距离最近的样本数据;
  •2. 根据获取得到的K个样本数据来预测当前待预测样本的目标属性值

三要素:K值选择/距离度量(欧式距离)/决策选择(平均值/加权平均)

Knn问题:数据量大,计算量较大;解决方案:kd-tree

kd-tree:计算方差,根据方差大的划分

伪代码实现:

  1. import numpy as np
  2. from collections import defaultdict
  3.  
  4. class myknn:
  5.  
  6. def fit(self, X, Y, k):
  7. self.train_x = X
  8. self.train_y = Y
  9. self.k = k
  10.  
  11. def predict(self, X):
  12. predict_labels = []
  13. for x in X:
  14. # 1. 从训练数据中获取K个和当前待预测样本x最相似的样本
  15. neighbors = self.fetch_k_neighbors(x)
  16. # 2. 将这K个最相似的样本中出现次数最多的类别作为预测值
  17. predict_label = self.calc_max_count_label(neighbors)
  18. # 3. 将当前样本的预测值添加到临时的列表中
  19. predict_labels.append(predict_label)
  20.  
  21. return predict_labels
  22.  
  23. def fetch_k_neighbors(self, x):
  24. distances = []
  25. for neighbor in self.train_x:
  26. dis = np.sqrt(np.sum((np.array(x) - neighbor) ** 2))
  27. distances.append(dis)
  28. neighbors_y_distances = [[neighbor, y, dis] for neighbor, y, dis in zip(self.train_x, self.train_y, distances)]
  29.  
  30. k_neighbors_y = sorted(neighbors_y_distances, key=lambda x: x[2])[:self.k]
  31. return k_neighbors_y
  32.  
  33. def calc_max_count_label(self, neighbors):
  34. y_count = defaultdict(int)
  35. for neighbor, y, _ in neighbors:
  36. y_count[y] += 1
  37. max_count_label = sorted(y_count.items(), key=lambda x: x[1], reverse=True)[0][0]
  38. return max_count_label
  39.  
  40. a = myknn()
  41. X = [
  42. [1, 2, 3],
  43. [4, 5, 6],
  44. [7, 8, 9],
  45. [10, 11, 12],
  46. [1, 2, 3],
  47. [4, 5, 6],
  48. [7, 8, 9],
  49. ]
  50. Y = [1, 2, 3, 2, 1, 2, 3]
  51. k = 3
  52. a.fit(X, Y, k)
  53. print(a.predict([[7, 8, 9], ]))
  1. sklearn 实现:
  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import matplotlib as mpl
  5. import os
  6.  
  7. if not os.path.exists('models'):
  8. os.mkdir('models')
  9. base_path = './models/' #模型保存路径
  10.  
  11. from sklearn.datasets import load_iris #load 鸢尾花数据
  12. from sklearn.model_selection import train_test_split #数据分割
  13. from sklearn.neighbors import KNeighborsClassifier #knn分类器
  14. from sklearn.externals import joblib #持久化
  15.  
  16. data = pd.read_csv('iris.data', header=None)
  17.  
  18. print(data.head())
  19. X = data.loc[:, :3] #前4列为特征数据
  20. Y = data[4] #最后一列为目标数据
  21. print(X.head())
  22.  
  23. X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=22)
  24.  
  25. '''
  26. def __init__(self,
  27. n_neighbors=5, #邻居数目
  28. weights='uniform', #uniform 等权重/distance
  29. algorithm='auto', #暴力计算和kd-tree
  30. leaf_size=30, #构建kd-tree 允许的最大叶子节点
  31. p=2, #距离公式
  32. metric='minkowski', #默认欧式距离
  33. metric_params=None,
  34. n_jobs=None, #开启多少个线程计算
  35. **kwargs):'''
  36.  
  37. algo = KNeighborsClassifier(n_neighbors=3)
  38. algo.fit(X_train, Y_train)
  39. print('准确率:{}'.format(algo.score(X_train, Y_train)))
  40.  
  41. # 持久化
  42. joblib.dump(value=algo, filename=base_path + 'knn.pkl')

机器学习开发流程:

  1. # 1. 数据加载
  2.  
  3. # 2. 数据的清洗、处理
  4.  
  5. # 3. 训练数据和测试数据的划分
  6.  
  7. # 4. 特征工程
  8.  
  9. # 5. 模型对象构建
  10.  
  11. # 6. 模型训练
  12.  
  13. # 7. 模型效果评估
  14.  
  15. # 8. 模型持久化
  16.  
  17. 持久化的方式主要三种:
  18. -1. 将模型持久化为二进制的磁盘文件。
  19. -2. 将模型参数持久化到数据库中。
  20. -3. 使用模型对所有数据进行预测,并将预测结果保存到数据库中。

机器学习系列算法1:KNN的更多相关文章

  1. 机器学习经典算法之KNN

    一.前言 KNN 的英文叫 K-Nearest Neighbor,应该算是数据挖掘算法中最简单的一种. 先用一个例子体会下. /*请尊重作者劳动成果,转载请标明原文链接:*/ /* https://w ...

  2. Python3实现机器学习经典算法(一)KNN

    一.KNN概述 K-(最)近邻算法KNN(k-Nearest Neighbor)是数据挖掘分类技术中最简单的方法之一.它具有精度高.对异常值不敏感的优点,适合用来处理离散的数值型数据,但是它具有 非常 ...

  3. 【机器学习】k近邻算法(kNN)

    一.写在前面 本系列是对之前机器学习笔记的一个总结,这里只针对最基础的经典机器学习算法,对其本身的要点进行笔记总结,具体到算法的详细过程可以参见其他参考资料和书籍,这里顺便推荐一下Machine Le ...

  4. 就是要你明白机器学习系列--决策树算法之悲观剪枝算法(PEP)

    前言 在机器学习经典算法中,决策树算法的重要性想必大家都是知道的.不管是ID3算法还是比如C4.5算法等等,都面临一个问题,就是通过直接生成的完全决策树对于训练样本来说是“过度拟合”的,说白了是太精确 ...

  5. 机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法

    机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...

  6. 机器学习十大算法 之 kNN(一)

    机器学习十大算法 之 kNN(一) 最近在学习机器学习领域的十大经典算法,先从kNN开始吧. 简介 kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个" ...

  7. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  9. <转>机器学习系列(9)_机器学习算法一览(附Python和R代码)

    转自http://blog.csdn.net/han_xiaoyang/article/details/51191386 – 谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更 ...

随机推荐

  1. werkzeug/routing.py-Rule源码分析

    Rule类主要用来定义和表示一个URL的模式.主要定义了一些关键字参数,用来改变url的行为.例如:这个url可以接收的请求方法,url的子域名,默认路径,端点名称,是否强制有斜杠在末尾等等 在最开始 ...

  2. js入门之DOM动态创建数据

    一. 知识点回顾 1. DOM结构 nodeName: '' 标签名 nodeType: '' 类型 1元素节点 2属性节点 3文本节点 nodeValue: '' 如果是元素节点 nodeValue ...

  3. JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--前戏

    new关键字,call/apply/bind方法都和this的绑定有关,在学习之前,首先要理解this. 一起来学习一下this吧 首先.this是一个对象. 对象很好理解,引用类型值,可以实现如th ...

  4. 如何使用.gitignore文件删除掉已经提交的文件

      如何使用.gitignore文件删除掉已经提交的文件 2018.06.06 22:13:38字数 96阅读 116 如果你的文件已经提交,而此时你才发现忘了添加.gitignore文件,不用担心, ...

  5. Harbor高可用理论及实践(汇聚篇)

    目录 一.理论概述 什么是harbor harbor要解决的问题 有了docker自带的registry为什么还要用harbor harbor的架构组件 Harbor工作原理 二.部署harbor及其 ...

  6. springboot系列(九)springboot使用druid数据源

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...

  7. 四:MySQL系列之Python交互(四)

    该篇主要介绍MySQL数据库的分表.以及与Python的交互的基本操作等. 一.拆分表操作 1.1  准备工作 创建数据库 --> 使用数据库 --> 创建数据表 --- 添加记录 -- ...

  8. Linux命令——pr

    参考:Linux命令——column 前言 接触这个命令的初衷是我想把一个很长的单列输出设置成多列输出,奈何column的分列输出机制太智障,直到我发现了pr 参数 pr -# 输出指定的列数. -t ...

  9. 用ffserver实现rtsp服务器的实验笔记

    参考:https://blog.csdn.net/hoyjam1/article/details/51281679 建议配置文件:/etc/config/ffserver.conf Port 1053 ...

  10. 学习使用Django2 前台页面展示

    Django  2.1  python 3.7 创建一个虚拟环境 python  -m  venv  虚拟环境名称 进入虚拟环境 下载django pip install  django==2.1 创 ...