1、将数据分为测试数据预测数据

2、数据分为data和target,data是矩阵,target是向量

3、将每条data(向量)绘制在坐标系中,就得到了一系列的点

4、根据每条data的target的不同,给点赋予不同的颜色

5、当新数据来到时,比如只有一条数据,将新数据绘制在坐标系中,就得到了新的一个点

6、确定k值,比如k=3

7、计算所有数据和新数据点的距离,找出最近的3个

8、根据结果判断新数据应该归属的分类,即为预测数据确定target

生成测试数据

import numpy as np
import matplotlib.pyplot as plt raw_data_a = np.random.random((10,2))
raw_data_b = np.random.randint(0,10,size=(10,2))
X_train = raw_data_a + raw_data_b
X_train
array([[8.28164975, 4.19315143],
[2.92775657, 0.81556491],
[4.50761169, 2.84927016],
[6.53083961, 4.26093009],
[2.27051172, 4.05065263],
[7.7954489 , 8.68019714],
[4.43708588, 6.72986275],
[4.65529575, 4.7985332 ],
[3.52301327, 4.19730249],
[2.2773095 , 0.07817849]])

构造target

y_train = np.array([0,0,0,0,0,1,1,1,1,1])
y_train
array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

绘制散点图

plt.scatter(X_train[y_train == 0,0], X_train[y_train == 0,1],color="b")
plt.scatter(X_train[y_train == 1,0], X_train[y_train == 1,1],color="r")

构造新数据

new_data_a = np.random.random((10,2))
new_data_b = np.random.randint(0,10,size=(10,2))
new_data = new_data_a + new_data_b
new_data
array([[7.66654552, 3.43737304],
[9.00627805, 8.35944151],
[4.35322638, 5.29260333],
[2.9064343 , 0.05002835],
[8.68350808, 1.50262447],
[0.23152764, 9.688442 ],
[9.2139265 , 7.96068869],
[5.14763436, 2.40288244],
[9.52077384, 9.4833882 ],
[5.04330854, 4.96045193]])

预测数据(拿一条数据举例)

X_predict = new_data[0]
X_predict
array([3.05595894, 6.89591993])

原始数据和预测数据共同绘制在一个坐标系中

plt.scatter(X_train[y_train == 0,0], X_train[y_train == 0,1])
plt.scatter(X_train[y_train == 1,0], X_train[y_train == 1,1])
plt.scatter(X_predict[0], X_predict[1], color="g")

 计算与测试点的距离

from math import sqrt

distances = [sqrt(np.sum((x - X_predict)**2)) for x in X_train]
distances
[5.883264572139944,
6.0817064237981535,
4.299147591752391,
4.360959428669816,
2.951689913705071,
5.064228496651553,
1.3910739045173681,
2.637595368153982,
2.7387361757860287,
6.862061882958762]

K = 6,找出距离最近的6个点

k = 6
nearest = np.argsort(distances)
topk_y = [y_train[i] for i in nearest[:k]]
topk_y
[1, 1, 1, 1, 1, 0]

结果

from collections import Counter
Counter(topk_y)
Counter({1: 5, 0: 1})
votes = Counter(topk_y)
votes.most_common(1)
[(1, 5)]
votes.most_common(1)[0][0]
1
predic = votes.most_common(1)[0][0]
predic
1

使用scikit-learn中的kNN

from sklearn.neighbors import KNeighborsClassifier

kNN_classifier = KNeighborsClassifier()
kNN_classifier.fit(X_train,y_train)
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=5, p=2,
weights='uniform')
kNN_classifier.predict(new_data_1.reshape(1,-1))
array([1])

重新整理knn代码

import numpy as np
from math import sqrt
from collections import Counter class KNNClassifier: def __init__(self, k):
# 初始化KNN分类器
self.k = k
self._X_train = None
self._y_train = None def fit(self, X_train, y_train):
# 根据训练集X_train, Y_train训练分类器
self._X_train = X_train
self._y_train = y_train
return self def predict(self, X_predict):
# 给定待遇测的数据集X_predict,返回表示X_predict的结果向量
y_predict = [self._predict(x) for x in X_predict]
return np.array(y_predict) def _predict(self, x):
# 给定单个待遇测数据x,返回x的预测结果值
distances = [sqrt(np.sum((x_train - x) ** 2)) for x_train in self._X_train]
nearest = np.argsort(distances)
topK_y = [self._y_train[i] for i in nearest[:self.k]]
votes = Counter(topK_y)
return votes.most_common(1)[0][0] def __repr__(self):
return "KNN=(%d)" % self.k
knn_clf = KNNClassifier(k=6)
knn_clf.fit(X_train, y_train)
KNN=(6)
y_predict = knn_clf.predict(X_predict)
y_predict
array([0, 1])
												

07.k近邻算法kNN的更多相关文章

  1. k近邻算法(KNN)

    k近邻算法(KNN) 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. from sklearn.model_selection ...

  2. 机器学习(四) 分类算法--K近邻算法 KNN (上)

    一.K近邻算法基础 KNN------- K近邻算法--------K-Nearest Neighbors 思想极度简单 应用数学知识少 (近乎为零) 效果好(缺点?) 可以解释机器学习算法使用过程中 ...

  3. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  4. 机器学习(四) 机器学习(四) 分类算法--K近邻算法 KNN (下)

    六.网格搜索与 K 邻近算法中更多的超参数 七.数据归一化 Feature Scaling 解决方案:将所有的数据映射到同一尺度 八.scikit-learn 中的 Scaler preprocess ...

  5. k近邻算法(knn)的c语言实现

    最近在看knn算法,顺便敲敲代码. knn属于数据挖掘的分类算法.基本思想是在距离空间里,如果一个样本的最接近的k个邻居里,绝大多数属于某个类别,则该样本也属于这个类别.俗话叫,"随大流&q ...

  6. 《机器学习实战》---第二章 k近邻算法 kNN

    下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...

  7. 最基础的分类算法-k近邻算法 kNN简介及Jupyter基础实现及Python实现

    k-Nearest Neighbors简介 对于该图来说,x轴对应的是肿瘤的大小,y轴对应的是时间,蓝色样本表示恶性肿瘤,红色样本表示良性肿瘤,我们先假设k=3,这个k先不考虑怎么得到,先假设这个k是 ...

  8. 机器学习随笔01 - k近邻算法

    算法名称: k近邻算法 (kNN: k-Nearest Neighbor) 问题提出: 根据已有对象的归类数据,给新对象(事物)归类. 核心思想: 将对象分解为特征,因为对象的特征决定了事对象的分类. ...

  9. 机器学习(1)——K近邻算法

    KNN的函数写法 import numpy as np from math import sqrt from collections import Counter def KNN_classify(k ...

随机推荐

  1. KVM (虚拟化网络管理)

    vlan:https://www.cnblogs.com/du-z/p/10802786.html trunk:https://www.cnblogs.com/du-z/p/10804773.html ...

  2. 34.vsftpd服务程序--虚拟用户模式

    1.创建用于进行FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密码. [root@localhost ~]# cd /etc/vsftpd/ [root@localhost vsftpd] ...

  3. 6127:Largest Average

    #include<bits/stdc++.h> using namespace std; int a[100001]; double ave[100001]; struct student ...

  4. UDP实现多人聊天

    发送端 package com.zy.exercise; import java.net.DatagramPacket; import java.net.DatagramSocket; import ...

  5. vue后台管理系统遇到的注意事项以及总结

    地址栏加#号问题:Vue-router 中有hash模式和history模式,vue的路由默认是hash模式,一般开发的单页应用的URL都会带有#号的hash模式第一步在router/index.js ...

  6. Codeforces Round #672 (Div. 2) D. Rescue Nibel! (思维,组合数)

    题意:给你\(n\)个区间,从这\(n\)区间中选\(k\)个区间出来,要求这\(k\)个区间都要相交.问共有多少种情况. 题解:如果\(k\)个区间都要相交,最左边的区间和最右边的区间必须要相交,即 ...

  7. 洛谷 P5837 [USACO19DEC]Milk Pumping G (单源最短路,dijkstra)

    题意:有一\(n\)个点,\(m\)条边的双向图,每条边都有花费和流量,求从\(1\)~\(n\)的路径中,求\(max\frac{min(f)}{\sum c}\). 题解:对于c,一定是单源最短路 ...

  8. 国产网络损伤仪 SandStorm -- 只需要拖拽就能删除链路规则

    国产网络损伤仪SandStorm可以模拟出带宽限制.时延.时延抖动.丢包.乱序.重复报文.误码.拥塞等网络状况,在实验室条件下准确可靠地测试出网络应用在真实网络环境中的性能,以帮助应用程序在上线部署前 ...

  9. ArcGIS制作MobileCache

    在使用ArcGIS Mobile进行二次开发时,矢量图层需要制作成MobileCache,才能在手持设备中加载. 下面介绍如何通过ArcMap制作MobileCache: 一.安装ArcGIS Mob ...

  10. codeforces 1036B - Diagonal Walking v.2【思维+构造】

    题目:戳这里 题意:起点(0,0),终点(n,m),走k步,可以走8个方向,问能不能走到,能走到的话最多能走多少个斜步. 解题思路:起点是固定的,我们主要分析终点.题目要求走最多的斜步,斜步很明显有一 ...