在实际工程当中,我们常常会遇到海量的数据,那作为一个数据挖掘准从业人员,如何从海量的数据当中挖掘出他们数据之间的关系和规律就显得尤为重要了。

今天我要讲的时海量高维数据及其近似最近邻方案。

K-近邻算法(KNN)概述

KNN是通过测量不同特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。

KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

距离准则

在聊接下去的内容之前,我们首先要了解一个概念,叫距离准则

距离准则有欧氏距离,Jaccard相似度,余弦相似度,Pearson相似度这几种,我们来分别解释下。

欧式距离就是指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离,所以它实现的是绝对距离。

余弦相似度是通过计算两个向量的夹角余弦值来评估他们的相似度。

Jaccard相似度是用于比较有限样本集之间的相似性与差异性,其中Jaccard系数值越大,样本相似度越高。

Pearson相似度是余弦相似度的升级版,它把每个向量都中心化了,即每个向量会减去所有向量的平均数,来实现数据更好的平衡,所以它实现的是相对距离。

近似最近邻问题(KNN=>ANN)

我们具体在哪些情景中会需要用到近似最近邻呢?举几个简单的例子:

  1. Google/Baidu每天有海量新增的网页,怎么判断内容是否抄袭之前的网页,哪个网页为原创?
  2. 论文如何快速查重?
  3. 如何快速推荐用户所需要的商品,冷启动问题?
  4. 图像检索的问题?

这就轮到我们近似最近邻(ANN)大显身手的时候了!~!

近似最近邻

首先,我们要明白,不管哪种算法,都是需要在空间和时间上做出取舍的。

我们可以事先对数据预先做一些划分和索引,在这个过程中,我们会损失了⼀点准确率(划分和索引会产生错误),但是能换取搜索速度的极大提升。

工程上常用算法:

  1. LSH(Local Sensitive Hash / 局部敏感度哈希)
  2. K-Means Tree
  3. K-D Tree

接下来我们就逐一讨论下这几个算法吧!~!

局部敏感度哈希

LSH保证高维空间相近的点在低维空间相近的概率很高,举个栗子,在高维度上我们有两个样本A,B离得很近,在我们在进行压缩降维,映射到一个低维空间以后,我们还能保证A,B的距离还是很近。这是一个映射,取回的过程。

LSH的直观理解

首先,我们把原始的样本点映射成⻓度为N的⼀个2进制串,这个我相信大家都能理解。其次我们在其中划分多次,平面的上下分别设为0/1。可以理解为每个位次在空间取了⼀个超平面去做。

举个栗子,100这个二进制串,我们怎么划分呢?因为它有三个位次,我们需要划分三次,划一刀x,它在x的1这边。再划一刀y,它在y的0这一边,再划一刀z,它在z的0这边。所以它所代表的点在100,再多划几刀就是超平面了,这个过程和SVM很像。

那会不会有误差呢?当然有了!之前我们就说过,在这个过程中,我们会损失⼀点准确率。比如说000和100所代表的点其实离得很近,但是因为x这一刀恰好划在了两个点之间,所以两个实际上离得很近的点就被分开了。

那有没有办法把精度补偿回来呢?当然有啦!But no pay , no gain ! 你需要付出一些时间成本和计算成本来交换。比如说:多次划分!

下面介绍一个在工业运用中的实例,用LSH来实现相似网页的查找:

Google每天会使用Simhash来完成完成亿级别的网页去重,具体就是将每个网页映射成64bit,当汉明距离<=3的网页就会被认为非常相近的网页。

嗯,我再举个经典的栗子吧,比如说有这么句话,“顾先生是大帅比!”。

  1. 我们把这句话分词,分词以后是“顾先生”,“是”,“大帅比”。
  2. 我们分别给每个词一个权重,比如说“顾先生”为8,“是”为2,“大帅比”为5。
  3. 我们对每个词做一个哈希,比如说“顾先生”为10,“是”为01,“大帅比”为11。
  4. 我们在它的基础上乘上权重,(这里要注意一点,如果位置上为0,那就权重*-1,而非*0),得到(8,-8),(-1,2),(5,5)。
  5. 将其纵向累加起来,得到(12,-1),然后做一个降维,得到(1,-1)
    这就是LSH的全过程。

这就是LSH的全过程。

再多嘴一句,给每个词的权重不是我瞎给的哦,可以去Google下tf-idf,简单来讲就是“顾先生”这个词在本篇文档里面出现了100次,但在总的文档里面也就出现了200次,那我们就可以认为这个词在这篇文档里面很重要,我们自然就给予它很重的权重。如果像“是”这个词在本篇文档里面出现了100次,但在总的文档里面却足足出现了两万次,那我们就可以认为这个词在这篇文档里面不太重要,我们当然也不会给它太大的权重了。

那除文本之外的其他格式的数据,如何求近似最近邻呢?

其实都是换汤不换药的,先把数据表示成向量格式,比如文本使用bag of words,ti-idf的方式, 图像使用GIST,HOG,SIFT,或者卷积神经网络尾层的方式,用户数据使用交互的商品和用户行为的统计值向量来完成从数据到向量的改变。

接下来就是使用库完成向量向低维度2进制空间映射的过程,也就是之前的找到合适的“超平面”切分得到01。

除了LSH算法,我们还有其他的算法,比如说K-means Tree

K-means Tree

K-means是⼤家都熟知的聚类算法。K-means Tree实际就是对数据做了多层K-means 。每⼀层到当前的划分“叶子节点”包含样本数都少于T个。

具体来说就是在总体上先划分,如果在划分后还剩下很多样本,远大于我们设置的阈值T,那我们对剩下的样本在做划分,直到每⼀层到当前的划分“叶子节点”包含样本数都少于T个。

接下来我们聊一聊ANN里面的K-D Tree

K-D Tree

K-dimension tree,对数据点在k维空间中划分的⼀种数据结构。K-D tree实际上是⼀种⼆叉树。我们来简单说⼀下构建和检索近似最近邻过程。

举个栗子,我们有{(2,3 ),(5,4),(9,6),(4,7), (8,1), (7,2)} 6个样本点,首先我们要找波动/方差最大的维度做二叉树切分,我们来看,第一个维度是{2,4,5,7,8,9},第二个维度是{1,2,3,4,6,7},很显然,第一个维度波动大。接着我们来找一下第一个维度的划分点。划分点要求左右可以平衡,可以直观地理解成中位数,那么第一个维度就是7。第一个维度完成后再找第二个维度,同理,第二个我们选择4。我们递归地完成这个过程。

有时候为了增加多样性,我们会随机取样本来确定哪些维度波动高,从而建立多棵树。

下面介绍几个ANN常用的库

ANNOY:建索引与最近邻查找,可以直接用list作为向量

举个栗子:

from annoy import AnnoyIndex
import random
f = 40 #建索引的维度
t = AnnoyIndex(f) #初始化一个对象
for i in range(1000): #产出1000个88维度的样本v = [random.gauss(0,1) for z in range(f)] #用高斯分布产生随机数后把它丢进克t.add_item(i,v) #丢进去的是list形式t.build(8) #产生8棵树t.save('test.ann') #保存模型#模型保存好了,如果我们以后要用它时,改怎么调用呢?u = AnnoyIndex(f)u.load('test.ann')print(u.get_nns_by_item(0,1000))

FLANN:

集成了多种最近邻检索方式,可以指定准确率

可以选择自动模式,它会帮你选最合适的模型和方式

载入数据量大模型的时候速度稍微有点慢。

举个栗子:

from pyflann import *
from numpy import *
from numpy.random import *dataset = rand(10000, 128) #random生成了10000个128维的向量
testset = rand(1000, 128) #random生成了1000个128维的向量flann = FLANN()
params = flann.build_index(dataset, algorithm="autotuned", target_precision=0.9, log_level = "info"); #自动调优,准确度为90%
print (params)result, dists = flann.nn_index(testset,5, checks=params["checks"]);

差不多就这样了,希望本文能够帮到你!~!

最后打个小广告,我的公众号,喜欢写点学习中的小心得,不介意可以关注下!~!

余弦相似度 高维数据_海量高维数据与近似最近邻相关推荐

  1. 算命数据_未来的数据科学家或算命精神向导

    算命数据 Real Estate Sale Prices, Regression, and Classification: Data Science is the Future of Fortune ...

  2. 天云大数据_天云大数据三度蝉联毕马威领先金融科技50强

    2019年1月,毕马威2018中国领先金融科技企业颁奖礼在京举行.这是毕马威第三次开展中国领先金融科技企业50年度评选,2016年及2017年,毕马威两次推出中国领先金融科技企业50名单并获得业界广泛 ...

  3. 余弦相似度和欧氏距离_欧氏距离和余弦相似度

    余弦相似度和欧氏距离 Photo by Markus Winkler on Unsplash Markus Winkler在Unsplash上拍摄的照片 This is a quick and str ...

  4. java使用xml存储数据_聊一聊 Redis 数据内部存储使用到的数据结构

    Redis 数据库虽然一直都在使用,但是对其内部存储结构之类的,都没有研究过,哪怕是面试的时候都没有准备过这方面的东西.最近在看一门网课,里面有讲到过这一块的内容,结合了<Redis 设计与实现 ...

  5. 机器学习与气象数据_气象大数据与机器学习联合实验室 大数据和气象的“联姻”...

    气象大数据与机器学习联合实验室 大数据和气象的"联姻" 来源:<中国科学报> 时间:2017-02-13 13:36:28 作者:沈春蕾 我们每天都在看天气预报,大家会 ...

  6. 数据中台是下一代大数据_全栈数据科学:下一代数据科学家群体

    数据中台是下一代大数据 重点 (Top highlight) Data science has been an eye-catching field for many years now to you ...

  7. vue取数据第一个数据_我作为数据科学家的第一个月

    vue取数据第一个数据 A lot. 很多. I landed my first job as a Data Scientist at the beginning of August, and lik ...

  8. 教育为什么重要 大数据_为什么开放数据在教育中很重要

    教育为什么重要 大数据 Rajan在距我家乡印度阿姆利则约140公里的一个小村庄上学. 否则,一个活泼的男孩会擅长在父亲便利店的分类帐簿中处理数字,并且喜欢吹笛子,进入教室后,他就会陷入冷漠和冷漠的深 ...

  9. hadoop 传感器数据_晋城大数据培训

    01 大数据入门基础课程 01 大数据入门基础课程 :::::::::10.Servlet 02 大数据Hadoop基础 1.大数据概论:框架:分布式文件系统:计算模型:5.全真实训项目 03 大数据 ...

最新文章

  1. 根据传入url请求,返回json字符串
  2. 语音合成的语音相位图
  3. how to identify keywords for search on Google Scholar?
  4. python读取大文件的坑_Python读取大文件的坑“与内存占用检测
  5. linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
  6. php entity,PHP html_entity_decode() 函数_程序员人生
  7. 用C语言编写贪吃蛇小游戏
  8. 网站死链接是什么,如何检测与提交?
  9. Java学习笔记(24)——正则表达式
  10. 【TWVRP】蚁群算法求解带时间窗的车辆路径规划问题【含Matlab源码 921期】
  11. android 夏令时,android – jodatime如何知道夏令时是否开启
  12. 山东省高中学业水平考试计算机考试教材,2017年山东高中学业水平考试科目
  13. SWIFT gpi Instant 成功与新加坡 FAST 进行全球测试
  14. 使用jquery easyui datetimebox 设置默认时间
  15. react-native-beacons-manager在Android上的使用 --工作笔记
  16. 2020年中国色纺纱行业市场现状分析,国内参与者呈现寡头模式「图」
  17. Google关键词排名多久做上去?谷歌新网站多久能有排名?
  18. 西北大学844计算机考研真题,2018年西北大学信息科学与技术学院844软件工程学科专业基础综合之计算机操作系统考研基础五套测试题...
  19. 天地图加载慢 快速打开天地图
  20. 忧喜交加的宜家,这些年到底错过了什么?

热门文章

  1. 逻辑漏洞-支付风险-大疆某处支付逻辑漏洞可1元买无人机
  2. linux rsh配置 A主机无需密码登录B主机
  3. C++-加载EXCEL数据
  4. matlab有限体积网格,用Matlab实现简单有限体积求解器
  5. python输入数字输出中文_go格式“占位符”, 输入输出,类似python的input
  6. linux远程无密码登录,linux ssh无密码登录,远程执行脚本文件
  7. python import from区别_python中import与from方法总结(推荐)
  8. linux 版本号 加号,Linux kernel编译生成的版本多一个加号“+”
  9. devexpress html编辑器,DevExpress 通用控件系列:TextEdit(2)
  10. 21天Jmeter打卡Day10线程用户之setUp和tearDown