目标:预测未知数据(或测试数据)X的分类y
批量kNN算法
1.输入一个待预测的X(一维或多维)给训练数据集,计算出训练集X_train中的每一个样本与其的距离
2.找到前k个距离该数据最近的样本-->所属的分类y_train
3.将前k近的样本进行统计,哪个分类多,则我们将x分类为哪个分类

# 准备阶段:

import numpy as np
# import matplotlib.pyplot as plt raw_data_X = [[3.393533211, 2.331273381],
[3.110073483, 1.781539638],
[1.343808831, 3.368360954],
[3.582294042, 4.679179110],
[2.280362439, 2.866990263],
[7.423436942, 4.696522875],
[5.745051997, 3.533989803],
[9.172168622, 2.511101045],
[7.792783481, 3.424088941],
[7.939820817, 0.791637231]
]
raw_data_y = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1] X_train = np.array(raw_data_X)
y_train = np.array(raw_data_y) x = np.array([8.093607318, 3.365731514])

核心代码:

 目标:预测未知数据(或测试数据)X的分类y
批量kNN算法
1.输入一个待预测的X(一维或多维)给训练数据集,计算出训练集X_train中的每一个样本与其的距离
2.找到前k个距离该数据最近的样本-->所属的分类y_train
3.将前k近的样本进行统计,哪个分类多,则我们将x分类为哪个分类 from math import sqrt
from collections import Counter # 已知X_train,y_train
# 预测x的分类
def predict(x, k=5):
# 计算训练集每个样本与x的距离
distances = [sqrt(np.sum((x-x_train)**2)) for x_train in X_train] # 这里用了numpy的fancy方法,np.sum((x-x_train)**2)
# 获得距离对应的索引,可以通过这些索引找到其所属分类y_train
nearest = np.argsort(distances)
# 得到前k近的分类y
topK_y = [y_train[neighbor] for neighbor in nearest[:k]]
# 投票的方式,得到一个字典,key是分类,value数个数
votes = Counter(topK_y)
# 取出得票第一名的分类
return votes.most_common(1)[0][0] # 得到y_predict predict(x, k=6)

面向对象的方式,模仿sklearn中的方法实现kNN算法:

import numpy as np
from math import sqrt
from collections import Counter class kNN_classify:
def __init__(self, n_neighbor=5):
self.k = n_neighbor
self._X_train = None
self._y_train = None def fit(self, X_train, y_train):
self._X_train = X_train
self._y_train = y_train
return self def predict(self, X):
'''接收多维数据,返回y_predict也是多维的'''
y_predict = [self._predict(x) for x in X]
# return y_predict
return np.array(y_predict) # 返回array的格式 def _predict(self, x):
'''接收一个待预测的x,返回y_predict'''
distances = [sqrt(np.sum((x-x_train)**2)) for x_train in self._X_train]
nearest = np.argsort(distances)
topK_y = [self._y_train[neighbor] for neighbor in nearest[:self.k]]
votes = Counter(topK_y)
return votes.most_common(1)[0][0] def __repr__(self):
return 'kNN_clf(k=%d)' % self.k

kNN(k近邻)算法代码实现的更多相关文章

  1. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  2. 第四十六篇 入门机器学习——kNN - k近邻算法(k-Nearest Neighbors)

    No.1. k-近邻算法的特点 No.2. 准备工作,导入类库,准备测试数据 No.3. 构建训练集 No.4. 简单查看一下训练数据集大概是什么样子,借助散点图 No.5. kNN算法的目的是,假如 ...

  3. KNN K~近邻算法笔记

    K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...

  4. KNN (K近邻算法) - 识别手写数字

    KNN项目实战——手写数字识别 1. 介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法.它的工作原理是:存在一个 ...

  5. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  6. 机器学习:k-NN算法(也叫k近邻算法)

    一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...

  7. 数据挖掘算法(一)--K近邻算法 (KNN)

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...

  8. 《机实战》第2章 K近邻算法实战(KNN)

    1.准备:使用Python导入数据 1.创建kNN.py文件,并在其中增加下面的代码: from numpy import * #导入科学计算包 import operator #运算符模块,k近邻算 ...

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

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

随机推荐

  1. asp.net core监控—引入Prometheus(三)

    上一篇博文中说到Prometheus有四种指标类型:Counter(计数器).Gauge(仪表盘).Histogram(直方图).Summary(摘要),并且我们做了一个Counter的Demo,接下 ...

  2. Power Apps 创建响应式布局

    前言 我们都知道Power Apps作为低代码平台,最大的优势就是各个设备之间的兼容性,尤其是自带的响应式布局,非常好用. 这不,我们就为大家分享一下,如何使用Power Apps画布应用,创建响应式 ...

  3. Windows安装RabbitMQ过程及相关问题

    一.下载 1.首先需要下载erlang,下载地址:http://www.erlang.org/downloads 2.其次需要下载RabbitMQ,下载地址:https://www.rabbitmq. ...

  4. ldconfig及LD_LIBRARY_PATH

    ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令:ldconfig.ldconfig 命令的用途,主要是在默认搜寻目录 (/lib和/usr/lib ...

  5. Java线程--ThreadPoolExecutor使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871132.html Java线程--ThreadPoolExecutor使用 public ...

  6. 手势仿QQ侧滑---秀清

    // // SlideViewController.h // qqcehua // // Created by 张秀清 on 15/5/25. // Copyright (c) 2015年 张秀清. ...

  7. 解决/WEB-INF目录下的jsp页面引入webRoot下的Js、css和图片的问题

    通常把jsp页面放在webRoot的/WEB-INF下可以防止访问者直接输入页面. 而webRoot的/WEB-INF下的页面是受保护的,用户无法通过形如http://localhost:8080/t ...

  8. gitlab登录时出现402的错误

    当登录gitlab时出现402的错误提示,可进行以下操作 重新设置一下系统时间 在new project 时若还出现同样的402问题,则清除一下浏览器的cookie即可

  9. OSI七层协议&TCP协议(三次握手四次挥手)

    今日内容 python 基础回顾 软件开发架构 网络理论前戏 OSI 七层协议(五层) TCP协议 三次握手与四次挥手 UDP协议 内容详细 一.python 基础回顾 1.基本数据类型 整型 int ...

  10. Diary -「PKUSC 2021」游记

      出游回来自然而然(?)地进入生产低谷的兔子只能写写游记了 qwq. Day -1 实时反馈赛制不是为防止你被数据调戏,而是给你调戏数据的机会. --鲁迅   PKU 一贯的 \(32\) 发提交实 ...