KNN要用到欧氏距离

KNN下面的缺点很容易使分类出错(比如下面黑色的点)

下面是KNN算法的三个例子demo,

第一个例子是根据算法原理实现

import matplotlib.pyplot as plt
import numpy as np
import operator
# 已知分类的数据
x1 = np.array([,,])
y1 = np.array([,,])
x2 = np.array([,,])
y2 = np.array([,,])
scatter1 = plt.scatter(x1,y1,c='r')
scatter2 = plt.scatter(x2,y2,c='b')
# 未知数据
x = np.array([])
y = np.array([])
scatter3 = plt.scatter(x,y,c='k')
#画图例
plt.legend(handles=[scatter1,scatter2,scatter3],labels=['labelA','labelB','X'],loc='best')
plt.show()
# 已知分类的数据
x_data = np.array([[,],
[,],
[,],
[,],
[,],
[,]])
y_data = np.array(['A','A','A','B','B','B'])
x_test = np.array([,])
# 计算样本数量
x_data_size = x_data.shape[]
print(x_data_size)
# 复制x_test
print(np.tile(x_test, (x_data_size,)))
# 计算x_test与每一个样本的差值
diffMat = np.tile(x_test, (x_data_size,)) - x_data
diffMat
# 计算差值的平方
sqDiffMat = diffMat**
sqDiffMat
# 求和
sqDistances = sqDiffMat.sum(axis=)
sqDistances
# 开方
distances = sqDistances**0.5
print(distances)
# 从小到大排序
sortedDistances = distances.argsort()#返回distances里的数据从小到大的下标数组
print(sortedDistances)
classCount = {}
# 设置k
k =
for i in range(k):
# 获取标签
votelabel = y_data[sortedDistances[i]]
# 统计标签数量
classCount[votelabel] = classCount.get(votelabel,) + #)0表示没有该字典里没有该值时默认为0
classCount
# 根据operator.itemgetter()-第1个值对classCount排序,然后再取倒序
sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(), reverse=True)
print(sortedClassCount)
# 获取数量最多的标签
knnclass = sortedClassCount[][]#第一个0表示取第一个键值对('A', ),第二个0表示取('A', )的‘A’
print(knnclass)
 1 import numpy as np#对iris数据集进行训练分类
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix#对模型分类结果进行评估的两个模型
import operator#https://blog.csdn.net/u010339879/article/details/98304292,关于operator的使用
import random
def knn(x_test, x_data, y_data, k):
x_data_size = x_data.shape[] # 计算样本数量
diffMat = np.tile(x_test,(x_data_size,)) - x_data# 复制x_test,计算x_test与每一个样本的差值
sqDiffMat = diffMat**# # 计算差值的平方
sqDistance = sqDiffMat.sum(axis= ) # 求和
distances = sqDistance**0.5 # 开方
sortedDistance = distances.argsort()# 从小到大排序
classCount = {}
for i in range(k):
vlabel = y_data[sortedDistance[i]] # 获取标签
classCount[vlabel] = classCount.get(vlabel,)+# 统计标签数量
sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(), reverse = True) # 根据operator.itemgetter()-第1个值对classCount排序,然后再取倒序
return sortedClassCount[][]
iris = datasets.load_iris()# 载入数据
x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.3)
#打乱数据
# data_size = iris.data.shape[]
# index = [i for i in range(data_size)]
# random.shuffle(index)
# iris.data = iris.data[index]
# iris.target = iris.target[index]
# test_size = #切分数据集
# x_train = iris.data[test_size:]
# x_test = iris.data[:test_size]
# y_train = iris.target[test_size:]
# y_test = iris.target[:test_size]
prodictions = []
for i in range(x_test.shape[]):
prodictions.append(knn(x_test[i],x_train,y_train,))
print(prodictions)
print(classification_report(y_test, prodictions))
print(confusion_matrix(y_test,prodictions))
#关于混淆矩阵可以看这篇博客,#https://www.cnblogs.com/missidiot/p/9450662.html
 # 导入算法包以及数据集
from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import random
# 载入数据
iris = datasets.load_iris()
#print(iris)
# 打乱数据切分数据集
# x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2) #分割数据0.2为测试数据,.8为训练数据 #打乱数据
data_size = iris.data.shape[]
index = [i for i in range(data_size)]
random.shuffle(index)
iris.data = iris.data[index]
iris.target = iris.target[index] #切分数据集
test_size =
x_train = iris.data[test_size:]
x_test = iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size] # 构建模型
model = neighbors.KNeighborsClassifier(n_neighbors=)
model.fit(x_train, y_train)
prediction = model.predict(x_test)
print(prediction)
print(classification_report(y_test, prediction))

这三个代码第一个,第二个是根据底层原理实现knn算法,第三个则是调用库函数处理数据。

下面一个代码是利用第三个代码中用到的库实现第一个代码功能,可以发现使用系统提供的库,简单许多

 from sklearn import  neighbors
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import numpy as np
x_data = np.array([[,],
[,],
[,],
[,],
[,],
[,]])
y_data = np.array(['A','A','A','B','B','B'])
x_test1 = np.array([[,]])
x_train, x_test, y_train,y_test = train_test_split(x_data, y_data,test_size= 0.3)
model = neighbors.KNeighborsClassifier(n_neighbors=)
model.fit(x_train, y_train)
print(x_test1)
prediction = model.predict(x_test1)
print(prediction)

KNN算法和实现的更多相关文章

  1. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. KNN算法

    1.算法讲解 KNN算法是一个最基本.最简单的有监督算法,基本思路就是给定一个样本,先通过距离计算,得到这个样本最近的topK个样本,然后根据这topK个样本的标签,投票决定给定样本的标签: 训练过程 ...

  3. kNN算法python实现和简单数字识别

    kNN算法 算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单 ...

  4. 什么是 kNN 算法?

    学习 machine learning 的最低要求是什么?  我发觉要求可以很低,甚至初中程度已经可以.  首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可.   数学方面 ...

  5. 数据挖掘之KNN算法(C#实现)

    在十大经典数据挖掘算法中,KNN算法算得上是最为简单的一种.该算法是一种惰性学习法(lazy learner),与决策树.朴素贝叶斯这些急切学习法(eager learner)有所区别.惰性学习法仅仅 ...

  6. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  7. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  8. 学习OpenCV——KNN算法

    转自:http://blog.csdn.net/lyflower/article/details/1728642 文本分类中KNN算法,该方法的思路非常简单直观:如果一个样本在特征空间中的k个最相似( ...

  9. KNN算法与Kd树

    最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知 ...

  10. Python 手写数字识别-knn算法应用

    在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...

随机推荐

  1. Python 文件处理一

    1.路径下所有文件(不包含子文件) import os dirs = os.listdir(path) 注:dirs 是一个list 2.遍历路径下所有文件 def file_name(file_di ...

  2. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  3. USACO2008 Cow Cars /// oj23323

    题目大意: N (1 ≤ N ≤ 50,000)头牛被编号为1-N,牛i可以在M(1 ≤ M ≤ N)条不同的高速路上以Si (1 ≤ Si ≤ 1,000,000) km/h的速度飞驰 为了避免相撞 ...

  4. flask-Local源码流程解析

    flask中Local源码数据类型首先明确:源码中要构造的数据类型数是这样的: __storage__ = { 用线程或者协程的唯一标识为键: {stack:[ctx(session/request) ...

  5. Linux命令速查手册(第2版)学习

    第1章.需要了解的命令行相关事项 表1-1 如何在文件名字符中使用特殊字符 字符 建议 / 绝不使用.不能转义 \ 必须转义.避免使用 _ 绝不能作为文件或目录名的第一个字符 [] 必须转义.避免使用 ...

  6. Controller 获取前端数据

    默认支持的类型 在controller的方法的形参中直接定义上面这些类型的参数,springmvc会自动绑定. HttpServletRequest对象 HttpServletResponse对象 H ...

  7. ibator配置文件说明文档

    1. <classPathEntry>  属性名 说明 示例 location 数据库驱动文件路径 lib/mysql-connector-java-5.1.6-bin.jar   2.  ...

  8. PyCharm中批量查找及替换

    选中需要操作的字符 Ctrl + R 替换 Ctrl + Shift + F 全局查找 Ctrl + Shift + R 全局替换 源自: PyCharm中批量查找及替换 - Ella_Wu - 博客 ...

  9. Tomcat的8080、8005、8009端口

    8080是http 1.1 connector,也就是接收处理http请求的端口,如果你只用一个tomcat处理所有请求,可以只使用这个connector. 8005是 tomcat接受关闭指令的端口 ...

  10. 非常棒的java在线编译平台

    1.godingground https://www.tutorialspoint.com/compile_java_online.php 2.ideone.com 3.jdoodle在线Java编译 ...