数据科学家需要具备专业 领域知识并研究相应的算法以分析对应的问题,而数据挖掘是其必须掌握的重要技术。以帮助创建推动业务发展的相应大数据产品和大数据解决方案。EMC最近的 一项调查也证实了这点。调查结果显示83%的人认为大数据浪潮所催生的新技术增加了数据科学家的需求。本文将为您展示如何基于一个简单的公式查找相关的项 目。请注意,此项技术适用于所有的网站(如亚马逊),以个性化用户体验、提高转换效率。
查找相关项问题
要想为一个特定的项目查找相关项,就必须首先为这两个项目定义相关之处。而这些也正是你要解决的问题:
- 在博客上,你可能想以标签的形式分享文章,或者对比查看同一个人阅读过的文章
- 亚马逊站点被称为“购买此商品的客户还购买了”的部分
- 一个类似于IMDB(Internet Movie Database)的服务,可以根据用户的评级,给出观影指南建议
不论是标签、购买的商品还是观看的电影,我们都要对其进行分门别类。这里我们将采用标签的形式,因为它很简单,而且其公式也适用于更复杂的情形。
以几何关系重定义问题
现在以我的博客为例,来列举一些标签:
- [ "API" , "Algorithms" , "Amazon" , "Android" , "Books" , "Browser" ]
好,我们来看看在欧式空间几何学中如何表示这些标签。
我们要排序或比较的每个项目在空间中以点表示,坐标值(代表一个标签)为1(标记)或者0(未标记)。
因此,如果我们已经获取了一篇标签为“API”和“Browser”的文章,那么其关联点是:
- [ 1, 0, 0, 0, 0, 1 ]
现在这些坐标可以表示其它含义。例如,他们可以代表用户。如果在你的系统中有6个用户,其中2个用户对一篇文章分别评了3星和5星,那么你就可以针对此文章查看相关联的点(请注意顺序):
- [ 0, 3, 0, 0, 5, 0 ]
现在我们可以计算出相关矢量之间的夹角,以及这些点之间的距离。下面是它们在二维空间中的图像:
欧式几何空间距离
计算欧式几何空间两点之间距离的数学公式非常简单。考虑相关两点A、B之间的距离:
两点之间的距离越近,它们的相关性越大。下面是Ruby代码:
- # Returns the Euclidean distance between 2 points
- #
- # Params:
- # - a, b: list of coordinates (float or integer)
- #
- def euclidean_distance(a, b)
- sq = a.zip(b).map{|a,b| (a - b) ** 2}
- Math.sqrt(sq.inject(0) {|s,c| s + c})
- end
- # Returns the associated point of our tags_set, relative to our
- # tags_space.
- #
- # Params:
- # - tags_set: list of tags
- # - tags_space: _ordered_ list of tags
- def tags_to_point(tags_set, tags_space)
- tags_space.map{|c| tags_set.member?(c) ? 1 : 0}
- end
- # Returns other_items sorted by similarity to this_item
- # (most relevant are first in the returned list)
- #
- # Params:
- # - items: list of hashes that have [:tags]
- # - by_these_tags: list of tags to compare with
- def sort_by_similarity(items, by_these_tags)
- tags_space = by_these_tags + items.map{|x| x[ :tags ]}
- tags_space.flatten!.sort!.uniq!
- this_point = tags_to_point(by_these_tags, tags_space)
- other_points = items.map{|i|
- [i, tags_to_point(i[ :tags ], tags_space)]
- }
- similarities = other_points.map{|item, that_point|
- [item, euclidean_distance(this_point, that_point)]
- }
- sorted = similarities.sort {|a,b| a[1] <=> b[1]}
- return sorted.map{|point,s| point}
- End
这是一些示例代码,你可以直接复制运行:
- # SAMPLE DATA
- all_articles = [
- {
- :article => "Data Mining: Finding Similar Items" ,
- :tags => [ "Algorithms" , "Programming" , "Mining" ,
- "Python" , "Ruby" ]
- },
- {
- :article => "Blogging Platform for Hackers" ,
- :tags => [ "Publishing" , "Server" , "Cloud" , "Heroku" ,
- "Jekyll" , "GAE" ]
- },
- {
- :article => "UX Tip: Don't Hurt Me On Sign-Up" ,
- :tags => [ "Web" , "Design" , "UX" ]
- },
- {
- :article => "Crawling the Android Marketplace" ,
- :tags => [ "Python" , "Android" , "Mining" ,
- "Web" , "API" ]
- }
- ]
- # SORTING these articles by similarity with an article
- # tagged with Publishing + Web + API
- #
- #
- # The list is returned in this order:
- #
- # 1. article: Crawling the Android Marketplace
- # similarity: 2.0
- #
- # 2. article: "UX Tip: Don't Hurt Me On Sign-Up"
- # similarity: 2.0
- #
- # 3. article: Blogging Platform for Hackers
- # similarity: 2.645751
- #
- # 4. article: "Data Mining: Finding Similar Items"
- # similarity: 2.828427
- #
- sorted = sort_by_similarity(
- all_articles, [ 'Publishing' , 'Web' , 'API' ])
- require 'yaml'
- puts YAML.dump(sorted)
你是否留意到我们之前选择的数据存在一个缺陷?前两篇文章对于标签“["Publishing", "Web", "API"]”有着相同的欧氏几何空间距离。
为了更加形象化,我们来看看计算第一篇文章所用到的点:
- [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
- [1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1]
只有四个坐标值不同,我们再来看看第二篇文章所用到的点:
- [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]
- [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1]
与第一篇文章相同,也只有4个坐标值不同。欧氏空间距离的度量取决于点之间的差异。这也许不太好,因为相对平均值而言,有更多或更少标签的文章会处于不利地位。
余弦相似度
这种方法与之前的方法类似,但更关注相似性。下面是公式:
下面是Ruby代码:
- def dot_product(a, b)
- products = a.zip(b).map{|a, b| a * b}
- products.inject(0) {|s,p| s + p}
- end
- def magnitude(point)
- squares = point.map{|x| x ** 2}
- Math.sqrt(squares.inject(0) {|s, c| s + c})
- end
- # Returns the cosine of the angle between the vectors
- #associated with 2 points
- #
- # Params:
- # - a, b: list of coordinates (float or integer)
- #
- def cosine_similarity(a, b)
- dot_product(a, b) / (magnitude(a) * magnitude(b))
- end
对于以上示例,我们对文章进行分类得到:
- - article: Crawling the Android Marketplace
- similarity: 0.5163977794943222
- - article: "UX Tip: Don't Hurt Me On Sign-Up"
- similarity: 0.33333333333333337
- - article: Blogging Platform for Hackers
- similarity: 0.23570226039551587
- - article: "Data Mining: Finding Similar Items"
- similarity: 0.0
这种方法有了很大改善,我们的代码可以很好地运行,但它依然存在问题。
示例中的问题:Tf-ldf权重
我们的数据很简单,可以轻松地计算并作为衡量的依据。如果不采用余弦相似度,很可能会出现相同的结果。
Tf-ldf权重是一种解决方案。Tf-ldf是一个静态统计量,用于权衡文本集合中的一个词在一个文档中的重要性。
根据Tf-ldff,我们可以为坐标值赋予独特的值,而并非局限于0和1.
对于我们刚才示例中的简单数据集,也许更简单的度量方法更适合,比如Jaccard index也许会更好。
皮尔逊相关系数(Pearson Correlation Coefficient)
使用皮尔逊相关系数(Pearson Correlation Coefficient)寻找两个项目之间的相似性略显复杂,也并不是非常适用于我们的数据集合。
例如,我们在IMDB中有2个用户。其中一个用户名为John,对五部电影做了评级: [1,2,3,4,5]。另一个用户名为Mary,对这五部电影也给出了评级:[4, 5, 6, 7, 8]。这两个用户非常相似,他们之间有一个完美 的线性关系,Mary的评级都是在John的基础上加3。
计算公式如下:
代码如下:
- def pearson_score(a, b)
- n = a.length
- return 0 unless n > 0
- # summing the preferences
- sum1 = a.inject(0) {|sum, c| sum + c}
- sum2 = b.inject(0) {|sum, c| sum + c}
- # summing up the squares
- sum1_sq = a.inject(0) {|sum, c| sum + c ** 2}
- sum2_sq = b.inject(0) {|sum, c| sum + c ** 2}
- # summing up the product
- prod_sum = a.zip(b).inject(0) {|sum, ab| sum + ab[0] * ab[1]}
- # calculating the Pearson score
- num = prod_sum - (sum1 *sum2 / n)
- den = Math.sqrt((sum1_sq - (sum1 ** 2) / n) * (sum2_sq - (sum2 ** 2) / n))
- return 0 if den == 0
- return num / den
- end
- puts pearson_score([1,2,3,4,5], [4,5,6,7,8])
- # => 1.0
- puts pearson_score([1,2,3,4,5], [4,5,0,7,8])
- # => 0.5063696835418333
- puts pearson_score([1,2,3,4,5], [4,5,0,7,7])
- # => 0.4338609156373132
- puts pearson_score([1,2,3,4,5], [8,7,6,5,4])
- # => -1
曼哈顿距离算法
没有放之四海而皆准的真理,我们所使用的公式取决于要处理的数据。下面我们简要介绍一下曼哈顿距离算法。
曼哈顿距离算法计算两点之间的网格距离,维基百科中的图形完美诠释了它与欧氏几何距离的不同:
红线、黄线和蓝线是具有相同长度的曼哈顿距离,绿线代表欧氏几何空间距离
相关推荐
2010版的《数据恢复技术深度揭秘》可能是一系列详细探讨这一主题的文档集合,由11份单独的文件组成,用户需要将这些文件合并成一个PDF以完整阅读。虽然具体的文件内容无法直接提供,但我们可以根据这个主题来深入...
在这个名为“国产烂片深度揭秘.zip”的项目中,我们聚焦于使用数据分析技术来探索和解析豆瓣电影数据库中关于中国国产烂片的信息。该项目的核心在于利用Python编程语言进行数据抓取、清洗、分析以及可视化,旨在深入...
《WinHex数据恢复技术深度揭秘》是一本深入探讨数据恢复技术的专业资料,主要围绕着WinHex这款强大的十六进制编辑器和数据恢复工具展开。WinHex不仅是一款通用的磁盘编辑器,更在数据恢复领域有着广泛的应用。下面将...
腾讯业务产品线众多,拥有海量的活跃用户,每天线上产生的数据超乎想象,必然会成为数据大户,为了保证公司各业务产品能够使用更丰富优质的数据服务,腾讯的大数据平台做了那些工作?具备哪些能力?大数据,这个词...
智能监控系统具有以下新特点:以资产为基础、实时掌握数据中心整体资产配置使用情况、运行趋势和健康状况、提供完善的故障处理和快速修复机制、能快速和准确定位问题根源、使用大数据分析技术挖掘监控数据价值、助力...
《Oracle内核技术揭秘》是一本深度探讨Oracle数据库内核技术的专业书籍,旨在帮助读者深入理解Oracle数据库的工作原理,提升数据库管理和优化能力。在Oracle这一标签下,我们可以挖掘出许多关键知识点,包括Oracle...
10. 学术前沿:包含对KDD(知识发现与数据挖掘)等学术会议论文的解读,以及计算机视觉领域顶会ICCV的论文解读,展示了学术界与工业界的紧密结合。 以上内容主要来自于2017年的技术分享和进展,但不少技术原理和...
- **目标**:进行深度的数据挖掘分析。 - **挑战**:需要丰富的行业经验和成熟的数据模型支持。 **2.2 Oracle 数据仓库的揭秘** **2.2.1 理解 Oracle 的数据仓库** - **R-OLAP (关系型 OLAP)** - **产品**:...
1. **大数据技术应用**:大数据平台整合了来自不同渠道的数据,包括销售数据、用户行为数据、社交媒体数据等,运用数据挖掘和机器学习算法,进行深度分析。这些技术帮助海尔识别消费者的购买习惯、偏好和需求,以便...
《ANDROID框架揭秘》是一本深度剖析Android操作系统框架的权威指南,专为对Android系统底层机制感兴趣的开发者和研究者设计。本书全面覆盖了Android框架的核心组件和技术,旨在帮助读者深入理解Android系统的运行...
深度 | 两个案例,掌握 AI 在大数据领域的前沿应用 203 近 300 位数据挖掘专家云集阿里,最精彩的发言都在这儿 213 权威详解 | 阿里新一代实时计算引擎 Blink,每秒支持数十亿次计算 220 如何扛住 1.8 亿 / 秒的双 ...
比如,通过对过往销售数据进行深度挖掘,可以预见某些时期内特定产品的热销情况,从而提前做好库存准备。此外,通过对运输路线、时间等因素的数据分析,还能优化配送路径,降低运输成本的同时提高客户满意度。 ### ...
“爱情代码”文档集合了社交网络分析、移动通讯数据、在线约会平台信息及问卷调查等多种数据源,运用先进的数据挖掘技术和机器学习算法,揭示了京沪程序员在择偶偏好、交往方式、生活节奏等方面的共性与差异。...
- **数据分析**:运用机器学习算法进行深度分析,洞察市场趋势和用户偏好。 - **数据服务**:基于数据结果,提供个性化的推荐服务和支持决策的数据支持。 #### 九、数字中台争先战 | 企业用数据驱动业务的架构 在...
2. 实时推荐系统:结合Spark Streaming处理实时用户行为数据,实现个性化推荐。 3. 机器学习应用:运用MLlib构建分类、回归、聚类模型,解决商业问题。 4. 图数据分析:通过GraphX分析用户关系网络,挖掘潜在价值。 ...
总的来说,《Matlab揭秘》是一本深度挖掘MATLAB功能的书籍,适合那些已经掌握MATLAB基础知识并希望进一步提升技能的读者。通过学习书中的实例和习题,读者不仅可以深化对MATLAB的理解,还能提高解决实际问题的能力。...
- **云计算与大数据挖掘**:讨论了云计算在大数据处理和挖掘中的应用,以及如何通过云计算提升数据分析的效率和效果。 #### 二、管理与创新思维 - **工程现状反思与工程思维方向**:提出了一事一职的组织原则,并...
3. 应用数据化和智能化:阿里云的飞天大数据平台、飞天IoT平台和飞天AI平台支持企业实现数据的深度挖掘和智能应用。四中台战略降低了创新门槛,加速了数字化进程。在数字政务和零售行业,阿里云积累了丰富的实践经验...