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. SparkSession、SparkContext、SQLContext和HiveContext之间的区别。

    SparkContext 是什么? 驱动程序使用SparkContext与集群进行连接和通信,它可以帮助执行Spark任务,并与资源管理器(如YARN 或Mesos)进行协调. 使用SparkCont ...

  2. 牛客练习赛43B Tachibana Kanade Loves Probability

    题目链接:https://ac.nowcoder.com/acm/contest/548/C 题目大意 略 分析 利用快速幂先移到 k1 位,然后开始一个一个取余数. 代码如下 #include &l ...

  3. 如何在Spring Boot 中动态设定与执行定时任务

    本篇文章的目的是记录并实现在Spring Boot中,动态设定与执行定时任务. 我的开发项目是 Maven 项目,所以首先需要在 pom.xml 文件中加入相关的依赖.依赖代码如下所示: <de ...

  4. HashMap底层实现原理及面试问题

    ①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...

  5. Pytorch模型定义的三要

    首先,必须继承nn.Module这个类,要让Pytorch知道这个类是一个Module. 其次,在_init_(self)中设置需要的组件,比如(Conv,Pooling,Linear,BatchNo ...

  6. Hive HA基本原理

  7. Spring Boot + Mybatis + H2 database数据库

    H2 Database H2 由纯 Java 编写的开源关系数据库,可以直接嵌入到应用程序中,不受平台约束,便于测试. h2数据库特点 (1)性能.小巧 (2)同时支持网络版和嵌入式版本,另外还提供了 ...

  8. mysql双主热备

    先搭建mysql主从模式,主从请参考mysql 主从笔记 然后在在配置文件里添加如下配置 1 log_slave_updates= #双主热备的关键参数.默认情况下从节点从主节点中同步过来的修改事件是 ...

  9. Go语言简介以及安装

    http://www.runoob.com/go/go-tutorial.html Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易. Go是从2007年末由Robert Grie ...

  10. Perl 数据类型

    Perl 数据类型 Perl 是一种弱类型语言,所以变量不需要指定类型,Perl 解释器会根据上下文自动选择匹配类型. Perl 有三个基本的数据类型:标量.数组.哈希.以下是这三种数据类型的说明: ...