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. C之输入输出函数(2) -- gets()

    https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_71/rtref/gets.htm#gets #include <stdio.h ...

  2. Dart编程实例 - Const 关键字

    Dart编程实例 - Const 关键字 void main() { final v1 = 12; const v2 = 13; v2 = 12; } 本文转自:http://codingdict.c ...

  3. thinkphp rpc

    RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议的存在 ...

  4. Service6

    rsync同步操作 同步 : 只传输变化的数据     复制:完整的传输 • 命令用法– rsync [选项...] 源目录 目标目录 • 同步与复制的差异– 复制:完全拷贝源到目标– 同步:增量拷贝 ...

  5. SP8222 NSUBSTR - Substrings(后缀自动机+dp)

    传送门 解题思路 首先建出\(sam\),然后把\(siz\)集合通过拓扑排序算出来.对于每个点只更新它的\(maxlen\),然后再从大到小\(dp\)一次就行了.因为\(f[maxlen-1]&g ...

  6. libvert开启TCP监听

    1.设置libvirtd 编辑/etc/libvirt/libvirtd.conf listen_tls = 0 listen_tcp = 1 auth_tcp="none" tc ...

  7. Invoking destroy method 'close' on bean with name 'dataSource'

    Invoking destroy method 'close' on bean with name 'dataSource' Spring与Mybatis整合时出现的问题,找了一晚上结果是一个属性写错 ...

  8. web自动化selenium click()方法失效的解决办法

    使用Python写web-ui自动化脚本时,如果浏览器窗口比较小或者电脑屏幕比较小时, 可能会遇到页面元素的点击click()方法失效的问题,报错如下: Element <span>... ...

  9. CSS3:FlexBox的详解

    Flexbox是Flexible box 的简称(灵活的盒子容器),是CSS3引入的新的布局模式.它决定了元素如何在页面上排列,使它们能在不同的屏幕尺寸和设备下可预测地展现出来. 它之所以被称为 Fl ...

  10. java-day02

    数据类型自动转换 要求:数据范围从小到大 数据类型强制类型转换 格式:范围小的数据类型 范围小的变量名 = (范围小的数据类型)原范围大的数据 注意事项: 1.可以会造成数据溢出或者是精度损失. 2. ...