KNN是通过测量不同特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

应用1:自己编写knn算法如下:

import pandas as pd
import numpy as np '''
约会样本数据说明datingTestSet.txt, 以tab键分开:
1、FlyMiles: 每年获得的飞行常客里程数;
2、PlayTime: 玩视频游戏所耗费的时间百分比
3、IceCream: 每周消费的冰淇淋公斤数
4、对约会对象的感觉
'''
#url表示数据文件存放的地址
url = 'Data/datingTestSet.txt' data = pd.read_table(url, sep='\t', header=None, names=['FlyMiles', 'PlayTime', 'IceCream', 'LikeDegree'])
#将LikeDegree一列由字符串转化为数字
like_mapping = {label: idx for idx, label in enumerate(np.unique(data['LikeDegree']))}
data['LikeDegree'] = data['LikeDegree'].map(like_mapping) #归一化
def autoNorm(data):
normal = (data - data.min()) / (data.max() - data.min())
scope = data.max() - data.min()
min = data.min()
return normal, scope, min # knn算法
def knn(inX, normal, label, k):
data_sub = normal - inX
data_square = data_sub.applymap(np.square)
data_sum = data_square.sum(axis=1)
data_sqrt = data_sum.map(np.sqrt)
dis_sort = data_sqrt.argsort()
#加上测试数numTest
k_label = label[dis_sort[:k] + 200]
label_sort = k_label.value_counts()
res_label = label_sort.index[0]
return res_label #测试结果
def datingTest():
normal, scope, min = autoNorm(data[['FlyMiles', 'PlayTime', 'IceCream']])
label = data.iloc[:, -1]
m = normal.shape[0]
numTest = int(m * 0.2)
errorCount = 0.0
for i in range(numTest):
result = knn(normal.iloc[i, :], normal.iloc[numTest : m, :], label[numTest : m], 3)
print("the classifier came back with: %d, the real answer is: %d" % (result, label[i]))
if(result != label[i]):
errorCount += 1.0
print("the total error rate is: %f" % (errorCount / float(numTest))) datingTest()

应用2:利用sklearn库函数

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier data = pd.read_table('Data/datingTestSet.txt', sep='\t', header=None, names=['FlyMiles', 'PlayTime', 'IceCream', 'LikeDegree'])
like_mapping = {label: idx for idx, label in enumerate(np.unique(data['LikeDegree']))}
data['LikeDegree'] = data['LikeDegree'].map(like_mapping)
X = data.iloc[:, 0:3]
y = data.iloc[:, -1] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=32)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
right_rate = knn.score(X_test, y_test)
print('the right rate is: %f' % right_rate)

大数据-KNN算法的更多相关文章

  1. 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法

    外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...

  2. Scala 大数据 常用算法收集

    一:IP转数字,用于比大小,用在求IP段范围中 def ip2Long(ip: String): Long = { val fragments = ip.split("[.]") ...

  3. 《零起点,python大数据与量化交易》

    <零起点,python大数据与量化交易>,这应该是国内第一部,关于python量化交易的书籍. 有出版社约稿,写本量化交易与大数据的书籍,因为好几年没写书了,再加上近期"前海智库 ...

  4. 后Hadoop时代的大数据架构(转)

    原文:http://zhuanlan.zhihu.com/donglaoshi/19962491 作者: 董飞       提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年 ...

  5. 年度钜献,108个大数据文档PDF开放下载

    1.大数据的开放式创新——吴甘沙 相关阅读:[PPT]吴甘沙:让不同领域的数据真正流动.融合起来,才能释放大数据的价值 下载:大数据的开放式创新——吴甘沙.pdf 2.微软严治庆——让大数据为每个人服 ...

  6. SparkSQL大数据实战:揭开Join的神秘面纱

    本文来自 网易云社区 . Join操作是数据库和大数据计算中的高级特性,大多数场景都需要进行复杂的Join操作,本文从原理层面介绍了SparkSQL支持的常见Join算法及其适用场景. Join背景介 ...

  7. 后Hadoop时代的大数据架构

    提到大数据分析平台,不得不说Hadoop系统,Hadoop到现在也超过10年的历史了,很多东西发生了变化,版本也从0.x进化到目前的2.6版本.我把2012年后定义成后Hadoop平台时代,这不是说不 ...

  8. 从技术 Leader 的招聘需求看,如何转岗为当前紧缺的大数据相关人才?

    前段时间,跟候选人聊天的时候,一个有多年工作经验的资深 iOS 工程师告诉我,他最近正在学习 Machine Learning 相关的知识.他觉得,对于程序员来说,技术进步大大超过世人的想象,如果你不 ...

  9. 带你装B,带你飞的大数据时代

    我接触过的大数据有: 1.美国棱镜计划 2.前几天新闻报道的,苹果公司窃取用户隐私 3.百度的用户搜素习惯统计分析 4.淘宝的用户购物习惯分析,智能推荐宝贝 5.浏览器的智能标签页 ... 最想了解的 ...

随机推荐

  1. Unity 调用jar闪退 解决方案

    { https://www.cnblogs.com/YZFHKMS-X/p/11864496.html }

  2. v-on 绑定单个或多个事件

    <div id="app07"> <!-- v-on:click 鼠标点击事件--> <a v-on:click="DoSomething& ...

  3. vue基础二

    1.vue实例 每个 Vue.js 应用都是通过构造函数 Vue 创建一个 Vue 的根实例 启动的.在实例化 Vue 时,需要传入一个选项对象,它可以包含数据.模板.挂载元素.方法.生命周期钩子等选 ...

  4. ueditor不能上传mp4格式的视频--解决方案

    1.ueditor.all.js 去掉所有的 type="application/x-shockwave-flash" 2.ueditor.all.min.js 去掉所有的 typ ...

  5. noip1998 提高组t3 挖地雷

    题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任一处 ...

  6. error LNK2019: 无法解析的外部符号 _PhInitializePhLib,该符号在函数 _EnumHandle 中被引用

    编译时提示上面的错误,而确实应用了该函数的库文件,直接搜索lib文件内容,发送该函数的声明如下_PhInitializePhLib@0 说明函数的编译方式和库文件的编译方式不同,发现该工程的调用约定为 ...

  7. 戏说 .NET GDI+系列学习教程(三、Graphics类的方法的总结)

  8. svn向服务器添加新建文件夹

    tip: 1)提交文件分为两步,先将要提交的文件加入缓存区,然后将文件提交 2)add:添加的意思.commit:提交的意思 第一步:加入缓存区(如图) 1)选择要提交的文件 2)右键svn---&g ...

  9. Git 学习第三天(二)

    默认情况下, Git合并是采用"fast forward"模式,但这种模式下,如果删除分支,会丢掉分支信息 禁用 fast forward 模式: git merge --no-f ...

  10. 如何发现 Redis 热点 Key ,解决方案有哪些?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 来源:http://t.cn/EAEu4to 一.热点问题产生原因 热点问题产生的原因大致有以下两种: 1.1 用户消费的数 ...