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

执行流程:

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

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

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

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

伪代码实现:

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

机器学习开发流程:

# 1. 数据加载

# 2. 数据的清洗、处理

# 3. 训练数据和测试数据的划分

# 4. 特征工程

# 5. 模型对象构建

# 6. 模型训练

# 7. 模型效果评估

# 8. 模型持久化

持久化的方式主要三种:
-1. 将模型持久化为二进制的磁盘文件。
-2. 将模型参数持久化到数据库中。
-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. 在Windows上安装 Consul

    使用Chocolatey(Windows包管理工具)安装 官方安装说明 https://chocolatey.org/install 安装Consul 官方安装说明 https://chocolate ...

  2. English-手机销售英文场景

    http://www.engpx.com/news/18216.html https://wenku.baidu.com/view/d67a103203768e9951e79b89680203d8ce ...

  3. 2602978 - [How to] Content Synchronization between SLDs

    http://47.101.174.212:52000/sld http://47.101.176.136:56000/sld Symptom As described in Planning Gui ...

  4. PE重装系统

    PE重装系统 PE: 含义:全称 Windows Preinstall Environment,即Windows 预安装环境 作用: 是一个用于Windows安装准备的最小操作系统,其实就是一个简易版 ...

  5. Ubuntu:一个部署好的tomcat应用(war包)怎么用Nginx实现动静分离?

    今天想把之前的一个demo用Nginx把资源分离开来,在网上看了一天,整整弄了一天,硬是没弄出来. 要么全是同样的内容的,要么就是环境跟我这里不一样的.再加上对Nginx没接触过,给我都整哭了差点. ...

  6. “key_share”和"pre_shared_key" 的区别

    越是基本的问题或者概念越是难解释或者讲清楚,论文写到现在真的好无助的样子 . 在LTS协议中牵扯到握手的认证和秘钥建立的时候,这连个概念经常混淆,TLS1.3版本协议为参照,区别这两个概念 1.概念的 ...

  7. G1垃圾收集器堆内存划分与角色分派【纯理论】

    接着上一次[https://www.cnblogs.com/webor2006/p/11123522.html]G1学习继续开启理论之旅.. G1的设计规划是要替换掉CMS[理想化的] G1在某些方面 ...

  8. element-ui 限制只能输入number

    element-ui <el-form-item label="大于等于:"> <el-input @keyup.native="number" ...

  9. 包,logging日志模块,copy深浅拷贝

    一 包 package 包就是一个包含了 __init__.py文件的文件夹 包是模块的一种表现形式,包即模块 首次导入包: 先创建一个执行文件的名称空间 1.创建包下面的__init__.py文件的 ...

  10. 2019牛客暑期多校训练营(第九场)The power of Fibonacci——循环节&&CRT

    题意 求 $\displaystyle \sum_{i=1}^n F_i^m $,($1 \leq n\leq 10^9,1 \leq  m\leq 10^3$),答案对 $10^9$ 取模. 分析 ...