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. POJ 1159 Palindrome-最长公共子序列问题+滚动数组(dp数组的重复利用)(结合奇偶性)

    Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...

  2. 完美解决 IE6 position:fixed 固定定位问题

    关于 position:fixed; 属性 生成绝对定位的元素,相对于浏览器窗口进行定位. 元素的位置通过 “left”, “top”, “right” 以及 “bottom” 属性进行规定. pos ...

  3. 初学hibernate的心得体会

    在初步学习了hibernate之后,使我明白了hibernate是一个怎样的软件.hibernate是一个比较独立的框架,它不需要太多其他软件的支持.hibernate是一个开放源代码的关系映射框架, ...

  4. 27-Ubuntu-远程管理命令-01-关机和重启

    关机和重启--shutdown 注: 不指定选项和参数,默认表示1分钟之后关闭电脑 远程维护服务器时,最好不要关闭系统而应该重启 实例1:立刻关机 shutdown -h now 实例2:未带任何参数 ...

  5. 【POJ】3278 Catch That Cow

    题目链接:http://poj.org/problem?id=3278 题意:有一头奶牛跑到了K的位置,农夫在N的位置,求最短抓到奶牛的时间. 农夫有两种移动方式. 1.步行:一分钟内从x->x ...

  6. scrapy 多个爬虫运行

    from scrapy import cmdline import datetime import time import os import scrapy from scrapy.crawler i ...

  7. 笔记23 搭建Spring MVC

    搭建一个最简单的SpringMVC示例 1.配置DispatcherServlet DispatcherServlet是Spring MVC的核心.在这里请求会第一次 接触到框架,它要负责将请求路由到 ...

  8. Photoshop基本操作

    PS 工具是我们使用频率比较高的软件之一, 我们学习PS目的不是为了设计海报做电商和UI的,而是要求: 会简单的抠图 会简单的修改PSD效果图 熟练的切图 能和网站美工美眉有共同话题..... Pho ...

  9. 微信公众号开发API接口大全

    在本文中,我们列出微信公众平台上可以使用的API接口以及举例如何在微信公众平台调用这些接口实现相应的功能. 接口调用说明: ① Appkey请使用的微信公众号,不要使用默认的trailuser ② 接 ...

  10. 那些年,我们见过的 Java 服务端“问题”

    导读 明代著名的心学集大成者王阳明先生在<传习录>中有云: 道无精粗,人之所见有精粗.如这一间房,人初进来,只见一个大规模如此.处久,便柱壁之类,一一看得明白.再久,如柱上有些文藻,细细都 ...