import operator
import numpy as np
# 鸢尾花的数据集 load_iris
from sklearn.datasets import load_iris '''
对测试集中的每个对象 X,依次执行以下操作:
(1)计算训练集中的所有对象与 X 之间的距离;
(2)按照距离递增的次序对训练集中的所有对象进行排序;
(3)选取与 X 距离最小的 K个对象;
(4)确定前 K 个对象所属类别的出现频率;
(5)返回前 K 个对象出现频率最高的类别,作为X的预测分类。
'''
######## 测试集 训练集 训练集对应的标签 几个最小的值
def knn(x_test, x_train, y_train, k):
#存储测试集预测出来的结果
predict_result_set=[]
# 训练集的长度
train_set_size = len(x_train) # 创建一个全零的矩阵,长度为130
distances = np.array(np.zeros(train_set_size))
# 计算每一个测试集与每一个训练集的距离
for i in x_test:
for indx in range(train_set_size):
# 计算数据之间的距离 欧式距离公式 来求测试数据到训练数据的距离
distances[indx] = np.sqrt(sum((i - x_train[indx]) ** 2))
sorted_dist = np.argsort(distances)
class_count = {}
# 取出k个最短距离
for i in range(k):
# 获得下标所对应的标签值
sort_label = y_train[sorted_dist[i]]
#print(i,sort_label,)
# get()函数返回指定键的值。
# 字典形式:key:判断之后的类别-value:有几个
class_count[sort_label]=class_count.get(sort_label, 0) + 1
# 对标签进行排序
sorted_class_count = sorted(class_count.items(), key=operator.itemgetter(1), reverse=True)
# print(sorted_class_count)
predict_result_set.append(sorted_class_count[0][0])
# 返回预测结果列表
return predict_result_set
##########################################
#简单的数据集进行试验
# 训练集 [打架次数,接吻次数]
trainData = np.array([[3, 104], [2, 100], [1, 81], [101, 10], [99, 5], [98, 2]])
# 标签 代表的类别
labels = ['Romance', 'Romance', 'Romance', 'Action','Action','Action']
# 测试集
testData = [18, 90]
############################################
# KNN算法是最近邻算法的一个延伸。基本思路:选择未知样本一定范围内的K个近邻样本,如果该K个近邻大多数属于某一类型,则未知样本就判定为该类型。
# KNN 可以说是一种最直接的用来分类未知数据的方法。
# 采用少数服从多数的原则,给新数据归类. if __name__ == "__main__":
# 加载数据集数据
iris = load_iris()
# 样本数据150*4二维数据,代表150个样本,每个样本4个属性分别为花瓣和花萼的长、宽
iris_x = iris.data
# permutation接收一个数作为参数(150),产生一个0-149一维数组,只不过是随机打乱的,当然她也可以接收一个一维数组作为参数,结果是直接对这个数组打乱
indices = np.random.permutation(len(iris_x))
# 样本数据的标签
iris_y = iris.target
# x 数据
# y 对应的标签
x_train, x_test, y_train, y_test = iris_x[indices[:-20]],iris_x[indices[-20:]],iris_y[indices[:-20]],iris_y[indices[-20:]]
# 调用前面定义的knn函数 6代表距离最近的6个 按照少数服从多数的原则进行“定义“
result = knn(x_test,x_train, y_train, 6)
print("原有标签:", y_test)
# 为了方便对比查看,此处将预测结果转化为array,可直接打印结果
print("预测结果:", np.array(result)) '''
优点
(1)算法思路较为简单,易于实现;
(2)当有新样本要加入训练集时,无需重新训练(即重新训练的代价低);
(3)算法的时间复杂度和空间复杂度与训练集的规模呈线性关系(在一些场合不算太大)。
不足
(1)分类速度慢;
整个算法的时间复杂度可以用O(m*n)表示,其中m是训练集的属性(特征)个数,而n是训练集的对象个数
(2) 各属性的权重相同,影响了准确率;
(3) 各类样本的数量不平衡时,也会影响预测准确率;
(4)K值不好确定;
'''
'''
KNN的一些改进策略
如果在使用KNN算法之前对样本的属性进行约简,删除那些对分类结果影响较小(不重要)的属性,则可以用KNN算法快速地预测待分类样本的类别,从而可以得到更好的计算效果。
缩小不相关的训练样本
'''

结果:

基于Python语言的KNN算法的更多相关文章

  1. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...

  2. 《Selenium2自动化测试实战--基于Python语言》 --即将面市

    发展历程: <selenium_webdriver(python)第一版>   将本博客中的这个系列整理为pdf文档,免费. <selenium_webdriver(python)第 ...

  3. 基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

    基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...

  4. 关于《Selenium3自动化测试实战--基于python语言》

    2016年1月,机缘巧合下我出版了<Selenium2自动化测试实战--基于python语言>这本书,当时写书的原因是,大部分讲Selenium的书并不讲编程语言和单元测试框,如果想在项目 ...

  5. 使用python模拟实现KNN算法

    一.KNN简介 1.KNN算法也称为K邻近算法,是数据挖掘分类技术之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. 2.KNN算法的核心思想是如果一个样本 ...

  6. selenium2自动化测试实战--基于Python语言

    自动化测试基础 一. 软件测试分类 1.1 根据项目流程阶段划分软件测试 1.1.1 单元测试 单元测试(或模块测试)是对程序中的单个子程序或具有独立功能的代码段进行测试的过程. 1.1.2 集成测试 ...

  7. selenium2环境搭建----基于python语言

    selenium支持多种语言如java.c#.Python.PHP等,这里基于python语言,所以这里搭建环境时需做俩步操作: ----1.Python环境的搭建 ----2.selenium的安装 ...

  8. 《Selenium 2自动化测试实战 基于Python语言》中发送最新邮件无内容问题的解决方法

    虫师的<Selenium 2自动化测试实战 基于Python语言>是我自动化测试的启蒙书 也是我推荐的自动化测试入门必备书,但是书中有一处明显的错误,会误导很多读者,这处错误就是第8章自动 ...

  9. Python简单实现KNN算法

    __author__ = '糖衣豆豆' from numpy import * from os import listdir import operator #从列方向扩展 #tile(a,(size ...

  10. 基于python语言的经典排序法(冒泡法和选择排序法)

    前 每逢周末就遇雨期,闲暇之余,捣鼓了下python,心心念想学习,今天就在电脑上装了个2.7,学习了下经典算法,冒泡与选择排序法 第一次写关于python的文章,说的不当之处,多多指正,我积极改正 ...

随机推荐

  1. 彻底解决各种浏览器访问不了GitHub问题(注意代理)

    如果有穿墙插件如Google助手  VPN  SS 之类别 有可能被全局代理 首先关闭这些软件 或者浏览器插件 假设,您的本地代理端口为:1080 ,打开git base窗口进行按下列的方式设置.(在 ...

  2. 浏览器手动设置Cookie

    浏览器手动设置Cookie js代码: document.cookie="{KEY}={Value}":  可多次执执行.

  3. java使用SFTP连接服务器下载,上传文件

    package mocha.framework.util; /* * @author Xiehj * @version 2019年10月28日 上午9:37:28 */ import java.io. ...

  4. P3047 [USACO12FEB]Nearby Cows G 题解

    P3047 [USACO12FEB]Nearby Cows G 题目描述 思路 使用换根DP, 设 \(dp[i][j]\) 表示以 \(i\) 为根节点的子树中深度小于等于 \(j\) 的点的权值之 ...

  5. 如何给Github上的开源项目提交PR?

    前言 对于一个热爱开源的程序员而言,学会给GitHub上的开源项目提交PR这是迈出开源的第一步.今天我们就来说说如何向GitHub的开源项目提交PR,当然你提交的PR可以是一个项目的需求迭代.也可以是 ...

  6. 详解同为4800W像素的相机传感器,三星GM1和索尼IMX586区别在哪里?

    数字影像之父Bryce Bayer基于RGB模式,通过在感光元件前加上一个滤镜的方法终于实现了彩色照片.Bayer滤镜跨出了照片从黑白到彩色的一大步,但是对于挑剔的人眼来说,每个像素只有一个颜色是远远 ...

  7. Ui2Code+ChatGPT助力低代码搭建

    前言 低代码开发平台(LCDP),是低代码或无代码通过快速搭建配置的方式完成一个应用程序的开发与上线,可视化低代码就是可视化的DSL,它的优点更多的是来源可视化,相对的,它的局限性也还是来源于可视化, ...

  8. 洛谷 P1122 最大子树和 题解

    一道入门的树形DP. 首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序.单调.子问题等等性质),以便于后续的转化.推理和处理.有序化可以"转化和创造 ...

  9. Java不能操作内存?Unsafe了解一下

    前言 C++可以动态的分类内存(但是得主动释放内存,避免内存泄漏),而java并不能这样,java的内存分配和垃圾回收统一由JVM管理,是不是java就不能操作内存呢?当然有其他办法可以操作内存,接下 ...

  10. Golang之旅——内存管理

    转载放在最前 一文带你了解,虚拟内存.内存分页.分段.段页式内存管理[Golang三关-典藏版]一站式Golang内存洗髓经 | Go 技术论坛 刘丹冰Aceld感谢以上文章作者,收获满满 存储器管理 ...