• Articles posted by Conan Zhang

Author Archives: Conan Zhang

About Conan Zhang

Programmer(Java,R,PHP,Javascript)

2024 湖北工业大学宣讲:企业中数据分析怎么做

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹,数据分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/meeting-hbut-20240321

前言

本次分享的初衷,一方面是为了给马上就毕业的同学,说说企业中如何做数据分析;另一方面,我作为企业负责人一直招不到合适的人才,也是非常难受。如果能把实际工作中遇到的问题,提前让向面临毕业学生知道,提前做好知识储备。那么,找工作也就没那么难了,同时招人也会顺畅起来,是一种双赢的局面。

本次分享其实是,企业和学生双向奔赴的一个实践活动,但由于多种原因,没能亲自到现场,略有遗憾。

目录

  1. 分享主题:企业中数据分析怎么做
  2. 会议体验和照片分享

1. 分享主题:企业中数据分析怎么做

现在我们正处于大数据时代,处处都产生数据,大部分数据已经不在稀缺,分析方法和算法模型都也写在了教课书中。
如何挖掘出数据的价值,让数据分析落地,把数据价值转换为业务价值,是数据分析师核心要考虑的。

数据分析要解决实际业务场景问题,伪需求、不清晰的目标,都会造成项目失败。数据分析不只是指标体系、更不是指标堆积,市场在变,数据也在变,我们的知识结构也要跟着变化。
数据分析对人的要求也越来越高,调包侠的时代已过。以新的视角,看数据、看业务、看我们自己,适应变化,才能把项目落地。

我主要为分三个部分进行介绍:

  • 什么是数据落地
  • 数据分析怎么做
  • 调包侠的时代已过
  • 企业需要什么样的人

2. 会议体验和照片分享

湖北工业大学创建于1952年,是一所以工学为主,经济学、法学、教育学、文学、理学、医学、管理学、艺术学、交叉学科等十大学科门类协调发展的多科性大学,是湖北省“双一流”建设高校、国家“中西部高校基础能力建设工程”高校、全国毕业生就业典型经验高校、全国深化创新创业教育改革示范高校、国家知识产权试点高校、国家“赋予科研人员职务科技成果所有权或长期使用权试点单位”、首批国家级现代产业学院建设单位、全国文明校园先进学校。

本次主要听从对象,面临找工作的(大三、大四、研究生),专业:数学,统计学,计算机,人数:50人,时长:1小时。
日期:2024年3月21日 15:00-16:00,远程腾讯会议。

我使用腾讯会议,远程进行的分享。

现场集中注意听课的同学们

我们企业中的实际数据分析工作,向同学们做了介绍,也希望同学们未来能够收获理想的工作。

转载请注明出处:
http://blog.fens.me/meeting-hbut-20240321

浅谈Sora新纪元下的数据分析的变革和机会

架构师的信仰系列文章,主要介绍我对系统架构的理解,从我的视角描述各种软件应用系统的架构设计思想和实现思路。

从程序员开始,到架构师一路走来,经历过太多的系统和应用。做过手机游戏,写过编程工具;做过大型Web应用系统,写过公司内部CRM;做过SOA的系统集成,写过基于Hadoop的大数据工具;做过外包,做过电商,做过团购,做过支付,做过SNS,也做过移动SNS。以前只用Java,然后学了PHP,现在用R和Javascript。最后跳出IT圈,进入金融圈,研发量化交易软件。

架构设计就是定义一套完整的程序规范,坚持架构师的信仰,做自己想做的东西。

关于作者:

  • 张丹,数据分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/ai-sora

前言

2024年初,AIGC领域迎来跨时代技术大爆发,OpenAl发布Sora引领了新一轮的科技革命。我受邀请参加2024 Global AI Bootcamp,参加圆桌讨论:畅谈Sora新纪元下的行业变革与商业价值。会议页面:2024 Global AI Bootcamp: 畅谈Sora新纪元下的行业变革与商业价值

我本身就处于数据分析行业,一直有关注于大模型的进展,特别是怕Sora(chatgpt) 的强大,很快会把我也进行替代,因此做了一些调研。观点不成熟,而且仅聚焦于我所处于的行业。

目录

  1. 我的背景
  2. Sora通用大模型目前还不完美
  3. 世界模拟器:想象空间很大
  4. 专业领域模型有自己的生成逻辑
  5. 数据分析,如何结合大语言模型

1. 我的行业背景

我是张丹,技术出身,擅长R语言,一直还处于一线做数据分析。公司是北京青萌数海科技有限公司,服务于政府客户,以数据分析、数据建模为主。

在大数据时代,各个政府部门也积累了大量的数据,但是还主要以专家经验为核心,我们通过AI模型,可以极大的提升监管的效率,提升命中的准确率。

像chatgpt,sora生成式的大模型,我们也很关注,一方面担心被替代,另一方面也在思考怎么能结合实际工作的特点,提升数据分析的效率。

2. Sora通用大模型目前还不完美

我的主要观点,目前来看Sora(chatgpt),为代表的通用大模型目前还不完美。

我们所从事的数据分析领域模型和生成式大模型底层逻辑是不同的,从感觉上chatgpt在数据分析领域落地,还是比较难的。这种“落地”是能够直接替代 数据分析师 的落地,而不是指为 数据分析师 提供工具,还是离不开大量人工的辅助工具化。

我认为通用大模型(chatgpt) 和 专业领域模型(机器学习、深度学习、强化学习),能力并一样。

特别是从评价的角度,通用大模型,现在都是一种“感觉”的评价,比如大模型chatgpt 写的文字不错,Sora生成画面很舒服,感觉很真实。而专业领域模型需要有明确的目标,要求准确、高效。比如,我们需要明确找到 在100万笔电商的订单中,哪笔订单有问题,是否可能为走私、逃税的违法操作。

各个行业其实都有自己的法律、规范、要求等明确的依据条文,业务人员根据这些条文的要求设定规则,专业领域模型(机器学习)通过泛化能力,以概率的方式转化对规则边界定义,但依然保持着对目标的方向的锁定。而chatgpt大模型,似乎又近一步做了泛化,将导致对于目标的清晰度近一步丢失。

我个人感觉,大模型能落地的部分,还是面向toC的娱乐领域,在toB/toG领域还有一段路要走。就好比 短视频 和 电影,一个是消遣和娱乐,一个是高质量和深度。领域不同,要求不同。

2. 世界模拟器:想象空间很大

OpenAI 提出Sora是世界模拟器,而不是简单的文生视频的工具,这无疑是增加了大家对Sora的未来的想象力,为了更高的估值,获得更多的资金。

当然,Sora的能力确实能给我们眼前一亮的感觉,大幅领先于同时期的模型,可以把原来做不到的进行实现。

再科幻一点的想象,Sora生成的视频,不是一个纯计算机的数字化计算。而是创造一个平行世界,把平行世界中的内容展示出来,就像神创造了人类,人类就是sora世界中的神。不仅可以对未来做预测,也可以重现历史上任何事情的发生。所以,OpenAI要做万亿美元的融资,增加算力。那么,可能就到了人类的末日了(科幻领域)。

但现在Chatgpt大模型公布的生成机理上,还到不了智慧化的水平,可能一种探索的方向。

不管是chatgpt,还是sora,都是基于Transformer框架,用到的计算机数字计算的一种方式。 chatgpt的训练,是把所有收集的文档内容,通过遮盖文档的一部分,进行预测,来建立所有文字之间的上下文关系。当我们输入一个问题,chatgpt把他已知的文字向量关系输出给我们。对于sora的训练,是把所有收集的图片,通过打马赛克的方式进行遮挡,再反向通过全马赛克开始进行预测,从而输出一幅高质量图片,再加上时间轴连成视频。

3. 专业领域模型有自己的生成逻辑

专业领域模型通常有自己的计算逻辑,专业领域模型,一种是科学领域,一种是应用领域。

在科学领域:

  • 央视报道:AI 仅用6周时间破解了移民火星的生存之谜,模拟243次实验,从数百万的方法中,找到了产生氧气的黄金配方,15小时,暴力穷举,足够人类生存的氧气。
  • 用AI进行科学研究,找到抗生素Halicin,能够杀灭对已知抗生素产生耐药性的细菌菌株。研究小组找到包含2000种已知特性分子数据库,标记是否能组织细菌生长,进行模型训练,自动识别哪些分子能进行抗菌。最后用来审查FDA批准的药物,和天然产品库的6万多种不同的分子结构。
  • Google推出的 GraphCast 产品预测天气预报,1 分钟内预测未来 10 天的天气,GraphCast 是一种基于机器学习和图神经网络 (GNN) 的天气预报系统,比传统方法便宜 1000 倍。

在应用领域:

  • 量化交易模型,根据金融市场交易的数据、信息、规则等,设计模型构建交易策略,实现基金的盈利。
  • 风险甄别模型,根据进出口货物贸易的法规、报关单数据、国际形势变化等,发现走私、逃税、洗钱等风险。

在专业领域中,我们都是从目标出发,到底要解决什么问题。那么,我们在培养一个专业的数据分析师时,一般会按照专家路线,从业务入手,边做边理解。但反观大模型的生成式的训练过程,其实与培养人的过程是不同的。

因此,大模型在短期内,应该还不能把我们替代。

4. 数据分析,如何结合大语言模型

如果不能替代,那么就考虑怎么结合。

让大模型结合专业领域模型,是一种可行的路径。以大模型为主线,打通各个孤立的专业领域模型。比如:天气+粮食+进出口贸易+国际形势 = ? 是否会有粮食危机。药品 + 疾病 + 基因 + 政策 = ?会出现什么。

从而找到市场的空白点,帮助数据分析师找到新的思路。

数据分析领域,我们也有一些痛点:

痛点一,随着chatgpt在生活中的普及,同时提升了大家的认知水平。做数据分析的从业者,又开始要面对领导提出问题,现在AI这么牛了,把数据给了模型,结果就出来了,应该要想什么就有什么,为什么你们做不到。说技术听不懂,说成本预算有限。所以,toG 的项目,也是挺难干的。

痛点二,整个的数据分析过程,对于大部分没有一线参与建模的人来说,还是不理解的,就像我们也不理解chatgpt,sora的一样,只是根据效果、论文、别人的解释,进行理解。如果通用人工智能,如果可以把整个的数据处理、加工、建模过程,可视化、解释性,进行解释出来,就是把专业的知识简单化,就可以大幅提升数据分析行业效率。

最后,说说我理解的 大模型toG落地。从技术上来讲,建模过程主要是训练和推理。训练:通过海量的高质量数据进行训练,特别是结合内网数据,结合知识图谱数据,可以大幅提升行业模型的适配度,让AI懂行业。推理:结合专业领域模型,进行推理的模拟,进行目标导向,提升准确率。

如果有一天实现了 适用于各个行业通用的推理引擎,专业领域模型就真的可以被替代了,也许世界模拟器,也就能真正实现了。

观点不成熟,而且仅聚焦于我所处于的行业。

转载请注明出处:
http://blog.fens.me/ai-sora

2024 Global AI Bootcamp: 畅谈Sora新纪元下的行业变革与商业价值

跨界知识聚会系列文章,“知识是用来分享和传承的”,各种会议、论坛、沙龙都是分享知识的绝佳场所。我也有幸作为演讲嘉宾参加了一些国内的大型会议,向大家展示我所做的一些成果。从听众到演讲感觉是不一样的,把知识分享出来,你才能收获更多。

关于作者

  • 张丹,数据分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/meeting-global-ai-bootcamp-beijing-20240309

前言

2024年初,AIGC领域迎来跨时代技术大爆发,OpenAl发布Sora引领了新一轮的科技革命。Global Al Bootcamp作为Prompt Engineering Conf系列活动的重要组成部分,致力于推动AI技术的创新与应用。作为促进人工智能行业发展的全球性盛会,该活动将于3月9日在北京盛大举行。届时,活动将汇聚全球AI开发者,共同学习、深入交流,共谋AI未来。

我参加了本次会议的圆桌讨论:畅谈Sora新纪元下的行业变革与商业价值

目录

  1. 圆桌主题:畅谈Sora新纪元下的行业变革与商业价值
  2. 会议体验和照片分享

1. 圆桌主题:畅谈Sora新纪元下的行业变革与商业价值

我的主要观点,专业领域模型和生成式大模型底层逻辑不同,在数据分析领域落地,还是比较难的。

通用大模型(chatgpt) 和 专业领域模型(机器学习、深度学习、强化学习),能力并一样。 通用大模型,现在都是一种感觉的评价,专业领域模型需要有明确的目标要准确、高效。能落地的部分,还处于面向toC的娱乐领域,在toB/toG领域,还有一段路要走。比如:短视频 和 电影 的区别。

我主要为分三个部分进行介绍:

  • Sora通用大模型目前还不完美
  • 专业领域模型,和生成式大模型,底层逻辑不同
  • 大模型,在数据分析领域落地,还比较难

本次分享的主题内容:畅谈Sora新纪元下的行业变革与商业价值

2. 会议体验和照片分享

此次盛会将邀请多位AIGC行业重磅嘉宾,包括多位 Microsoft MVP(微软最有价值专家)和专注在人工智能领域的资深专家,他们将以其专业知识和丰富经验,引领参与者们从初步了解到深入探索AI服务在不同领域的应用潜力。

我们诚挚地邀请您参加本次活动,深入体验科技与智慧的精彩交融,共同见证AI时代所带来的创新、变革与无限可能。

时间:2024年3月9日 14:00-17:30
地点:北京市海淀区丹棱街5号微软亚太研发集团总部1号楼-故宫厅

本次会议官方报名页:https://www.huodongxing.com/event/9743975484400

2.1 会议主题

本次圆桌会议共有5位专家一位交流:明叔(主待),刘海峰,张丹,强子,常政。

明叔,,《明说三人行》访谈栏目创始人兼主持人
刘海峰,本次大会的发起人,微软MVP/软积木CEO,PEC China发起人

左边是明叔,右边是刘海峰。

张丹,微软MVP,北京青萌数海CTO

强子,全球游戏研发领域资深专家,曾任DECA中国美术总监

常政,Micro Saas 开发者公会发起人

讨论方向:

  1. 问题1:现在我们在生活中可以看到很多AI生成的内容,图片/视频/声音,这些内容并不完美
  2. 问题2:商业化上要看消费者消费的具体是什么?
  3. 问题3:2C vs. 2B
  4. 收尾:如果明年这个时候我们这次相聚,AIGC应该是什么状况了?

2.2 相关照片

参会人员大合照,感觉场地小了一点。

还准备了精美的零食和点心

会场都坐满了

人人都有收获,活动圆满成功。同时,感谢MVP活动的霸姐支持。

转载请注明出处:
http://blog.fens.me/meeting-global-ai-bootcamp-beijing-20240309

用R语言实现点积相似度Dot Product Similarity

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-dot-product-similarity/

前言

在文字处理时,我们经常需要判断两段文字是否相似,计算文本相似度有很多度种方法,文本将介绍最简单,也是计算最高效的一种方法点积相似度,与余弦相似度很像,与欧式距离相似度也很像。

目录

  1. 点积相似度介绍
  2. R语言实现点积计算
  3. 点积相似度应用

1. 点积相似度介绍

点积在数学中,又称数量积(dot product 或者 scalar product),是指接受在实数R上的两个向量并计算它们对应元素的乘机之和,也是欧几里得空间的标准内积。当两个向量进行点积操作时,结果的大小可以反映两个向量的相似性。这是因为点积操作考虑了向量的方向和大小。

点积计算

点积有两种定义方式:代数方式和几何方式。通过在欧氏空间中引入笛卡尔坐标系,向量之间的点积既可以由向量坐标的代数运算得出,也可以通过引入两个向量的长度和角度等几何概念来求解。

代数方式:

两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:

几何方式:

点积相似度

点积相似度,是一种计算两个向量之间相似性的方法,对于两个向量a和b,它们的点积相似度为它们对应元素的乘机之和。

假设我们有两个向量 A 和 B,它们的点积定义为:

A . B = |A| * |B| * cos(θ)
其中,|A| 和 |B| 分别是 A 和 B 的长度,θ 是 A 和 B 之间的夹角。
  • 当 A 和 B 的方向相同时(即它们的夹角接近0),cos(θ) 接近 1,所以 A . B 较大。这表明 A 和 B 很相似。
  • 当 A 和 B 的方向相反时(即它们的夹角接近180度),cos(θ) 接近 -1,所以 A . B 较小,甚至为负。这表明 A 和 B 不相似。
  • 当 A 和 B 互相垂直时(即它们的夹角为90度),cos(θ) 为 0,所以 A . B 为 0。这表明 A 和 B 没有相似性。

因此,通过计算向量的点积,我们可以得到一个衡量两个向量相似性的标量值。在深度学习中,尤其是在自然语言处理和推荐系统中,我们经常需要衡量和比较向量(例如,单词嵌入或用户和物品的嵌入)的相似性。在这些情况下,点积是一种简单且有效的方法。

2. R语言实现点积计算

根据公式计算点积是很简单的,用R语言的基本函数,就可以完成点积的计算。

首先,定义2个向量a和b。


> a <- c(2, 5, 6)
> b <- c(4, 3, 2)

代数方式实现


> fun1<-function(a,b){
+   sum(a*b)
+ }
> 
> fun1(a,b)
[1] 35

几何方式实现


> fun2<-function(a,b){
+   a %*% b  
+ }
> 
> fun2(a,b)
     [,1]
[1,]   35

3. 点积相似度应用

接下来,我们设置一个场景,用点积相似度计算,计算不同人的简历的相似度。

假设有三个求职者A,B,C,从简历中提取了5个属性,分别是:性别、学历、籍贯、编程语言、职位。

姓名性别学历籍贯编程语言职位
A本科浙江JAVA开发工程师
B硕士北京R算法工程师
C本科上海JAVA开发工程师

那么,我们可以把上面的表格转换为一个矩阵:


[
[男	本科	浙江	JAVA	开发工程师],
[女	硕士	北京	R	算法工程师],
[男	本科	上海	JAVA	开发工程师],
]

然后,我们把这个矩阵转置:


[
[男, 女, 男]
[本科, 硕士, 本科],
[浙江, 北京, 上海],
[JAVA, R, JAVA],
[开发工程师, 算法工程师, 开发工程师]
]

计算上面2个矩阵的点积,计算过程为:


[
[男 * 男 + 本科 * 本科 + 浙江 * 浙江 + JAVA * JAVA + 开发工程师*开发工程师,
男 * 女 + 本科 * 硕士 + 浙江 * 北京 + JAVA * R + 开发工程师*算法工程师,
男 * 男 + 本科 * 本科 + 浙江 * 上海 + JAVA * JAVA + 开发工程师*开发工程师],
[女 * 男 + 硕士 * 本科 + 北京 * 浙江 + R * JAVA + 算法工程师*开发工程师,
女 * 女 + 硕士 * 硕士 + 硕士 * 硕士 + R * R + 算法工程师*算法工程师,
女 * 男 + 硕士 * 本科 + 北京 * 上海 + R * JAVA + 算法工程师*开发工程师],
[男 * 男 + 本科 * 本科 + 上海 * 浙江 + JAVA * JAVA + 开发工程师*开发工程师,
男 * 女 + 本科 * 硕士 + 上海 * 北京 + JAVA * R + 开发工程师*算法工程师,
男 * 男 + 本科 * 本科 + 上海 * 上海 + JAVA * JAVA + 开发工程师*开发工程师],
]

这里为了便于计算,我们假设将值相等的点积值设为1,不相等设为0,计算结果为一个3*3的矩阵,得到计算结果为:


[
[5, 0, 4]
[0, 5, 0]
[4, 0, 5]
]

我们可以认为这个矩阵代表了,三个人之间两两的关联度,数值越大越相似。

ABC
A504
B050
C405

于是,这样我们再比较简历的时候,就可以判断谁和谁比较相似了。词向量计算,和这个计算过程是类似的。因此,在文本的的匹配过程中,每个词都可以找到与之相似度分数最高的一个关联词。

最后,我们用R语言来模拟上面的手动计算过程。

首先,用R语言来构建数据集resume。


> resume<-data.frame(
+   `姓名`=c('A','B','C'),
+   `性别`=c('男','女','男'),
+   `学历`=c('本科','硕士','本科'),
+   `籍贯`=c('浙江','北京','上海'),
+   `编程语言`=c('JAVA','R','JAVA'),
+   `职位`=c('开发工程师','算法工程师','开发工程师')
+ )

> resume
  姓名 性别 学历 籍贯 编程语言       职位
1    A   男 本科 浙江     JAVA 开发工程师
2    B   女 硕士 北京        R 算法工程师
3    C   男 本科 上海     JAVA 开发工程师

把data.frame矩阵化,同时建立转置矩阵


> m1<-resume[,-1];m1
  性别 学历 籍贯 编程语言       职位
1   男 本科 浙江     JAVA 开发工程师
2   女 硕士 北京        R 算法工程师
3   男 本科 上海     JAVA 开发工程师
> m2<-t(m1);m2
         [,1]         [,2]         [,3]        
性别     "男"         "女"         "男"        
学历     "本科"       "硕士"       "本科"      
籍贯     "浙江"       "北京"       "上海"      
编程语言 "JAVA"       "R"          "JAVA"      
职位     "开发工程师" "算法工程师" "开发工程师"

建立函数dot_similary(),完成点积的计算,得到点积相似度矩阵。本文的代码实现过程,没有使用矩阵的方法来实现,因此这里主要是介绍计算思路。


> dot_similary<-function(df){
+   m1<-df[,-1];m1
+   m2<-t(m1);m2
+   
+   n<-nrow(m1)
+   mm<-matrix(0,nrow=n,ncol=n)
+   for(i in 1:n){
+     for(j in 1:n){
+       v<-length(which(m1[i,]==m2[,j]))    
+       mm[i,j]<-v
+     }
+   }
+   
+   colnames(mm)<-df[,1]
+   rownames(mm)<-df[,1] + mm + } # 运行函数,获得结果 

> dot_similary(resume)
  A B C
A 5 0 4
B 0 5 0
C 4 0 5

如果看看计算过程,可以打印矩阵点积计算的过程。


> row1<-paste(
+   paste(paste(m1[1,],m2[,1], sep='*'),collapse = "+"),
+   paste(paste(m1[1,],m2[,2], sep='*'),collapse = "+"),
+   paste(paste(m1[1,],m2[,3], sep='*'),collapse = "+"),
+   sep=","
+ )
> row1
[1] "男*男+本科*本科+浙江*浙江+JAVA*JAVA+开发工程师*开发工程师,男*女+本科*硕士+浙江*北京+JAVA*R+开发工程师*算法工程师,男*男+本科*本科+浙江*上海+JAVA*JAVA+开发工程师*开发工程师"
 
> row2<-paste(
+   paste(paste(m1[2,],m2[,1], sep='*'),collapse = "+"),
+   paste(paste(m1[2,],m2[,2], sep='*'),collapse = "+"),
+   paste(paste(m1[2,],m2[,3], sep='*'),collapse = "+"),
+   sep=","
+ )
> row2
[1] "女*男+硕士*本科+北京*浙江+R*JAVA+算法工程师*开发工程师,女*女+硕士*硕士+北京*北京+R*R+算法工程师*算法工程师,女*男+硕士*本科+北京*上海+R*JAVA+算法工程师*开发工程师"
 
> row3<-paste(
+   paste(paste(m1[3,],m2[,1], sep='*'),collapse = "+"),
+   paste(paste(m1[3,],m2[,2], sep='*'),collapse = "+"),
+   paste(paste(m1[3,],m2[,3], sep='*'),collapse = "+"),
+   sep=","
+ )
> row3
[1] "男*男+本科*本科+上海*浙江+JAVA*JAVA+开发工程师*开发工程师,男*女+本科*硕士+上海*北京+JAVA*R+开发工程师*算法工程师,男*男+本科*本科+上海*上海+JAVA*JAVA+开发工程师*开发工程师"

本文我们了解点积相似度的原理和实现,并且应用了点积似度,对简历中的人进行了相似度的计算,从而可以判断两个人之间的相似程度,让我们进行文本匹配时又多了一种方法。本文代码:https://github.com/bsspirit/r-string-match/blob/main/dotproduct.r

转载请注明出处:
http://blog.fens.me/r-dot-product-similarity/

打赏作者

用R语言实现余弦相似度Cosine Similarity

R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大。

R语言作为统计学一门语言,一直在小众领域闪耀着光芒。直到大数据的爆发,R语言变成了一门炙手可热的数据分析的利器。随着越来越多的工程背景的人的加入,R语言的社区在迅速扩大成长。现在已不仅仅是统计领域,教育,银行,电商,互联网….都在使用R语言。

要成为有理想的极客,我们不能停留在语法上,要掌握牢固的数学,概率,统计知识,同时还要有创新精神,把R语言发挥到各个领域。让我们一起动起来吧,开始R的极客理想。

关于作者:

  • 张丹,分析师/程序员/Quant: R,Java,Nodejs
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/r-cosine-similarity/

前言

在文字处理时,我们经常需要判断两段文字是否相似,如果这两段文字的用词越相似,它们的内容就应该越相似。这个场景下,我们就可以考虑先把文字转换成词频向量,然后用余弦相似度来判断是否相似。

目录

  1. 余弦相似度介绍
  2. R语言实现余弦相似度
  3. 计算2个文本的相似度

1. 余弦相似度介绍

余弦相似度,通过测量两个向量的夹角的余弦值来度量它们之间的相似性。例如,将两篇文章向量化,余弦距离可以避免因为文章的长度不同而导致距离偏大,余弦距离只考虑两篇文章生成的向量的夹角。

余弦相似度被大量用于对比:如人脸对比、声音对比,来快速判断两个图片或者两段声音的相似度,进而判断是不是来自同一个人。当一个图像或者声音样本具有n维的特征,我们就可以把他认为是n维向量,两个样本使用余弦相似度比对时,就是对两个n维向量的夹角余弦值,其大小进行衡量。

余弦相似度的取值范围是[-1,1],相同两个向量的之间的相似度为1。余弦距离的取值范围是[0,2]。

  • 当夹角为0,两个向量同向,相当于相似度最高,余弦值为1,表示完全正相关。
  • 当夹角90°,两个向量垂直,余弦为0,表示不相关。
  • 当夹角180°,两个向量反向,余弦为-1,表示完全负相关。

计算公式:

相比其他的距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。

欧式距离与余弦距离的对比:

  1. 欧式距离的数值受到维度的影响,余弦相似度在高维的情况下也依然保持低维完全相同时相似度为1等性质。
  2. 欧式距离体现的是距离上的绝对差异,余弦距离体现的是方向上的相对差异。

不同情况不同选择:

  1. 两个人分别取了蓝球(1,0)与红球(0,1),这两个向量的欧式距离较小,可是事实是这两个球是不同的,而余弦距离为2表示的是完全不同的意思。所以在这种情况下选择余弦距离更具合理性。
  2. 两个人对APP的使用次数与使用时长分别表示为(1,10),(10,100),可知余弦相似度较小,说明这两个人的行为时相同的,可是,事实是不同的,两个人的活跃度有着极大的差异,第二个人的活跃度更高。

2. R语言实现余弦相似度

我们可以安装lsa包,使用cosine()函数,计算2个向量的余弦相似度。

lsa(Latent Semantic Analysis 潜在语义分析)包基本思想是,文本确实具有高阶(=潜在语义)结构,但这种结构会被词语用法(如通过使用同义词或多义词)所掩盖。通过对给定的文档-术语矩阵进行截断奇异值分解(双模式因子分析),以统计方式得出概念指数,从而克服了这一可变性问题。

lsa包的安装过程比较简单。


> install.packages(lsa)
> library(lsa>

计算2个向量的余弦相似度。


> vec1 = c( 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 )
> vec2 = c( 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 )
> cosine(vec1,vec2) 
          [,1]
[1,] 0.2357023

3. 计算2个文本的相似度

有了计算余弦相似度的工具后,那么接下来,我们就可以尝试计算文本的相似度了。

使用余弦相似度,计算文本相似的具体步骤:

  1. 定义两个文本内容
  2. 对两个文本内容进行分词
  3. 列出所有的词,并计算词频
  4. 整理词频为词向量
  5. 用余弦相似度计算词向量

第一步,我们定义两段文本内容,分别是

  • 句子1:”我买了一个手机,又配了一个手机壳”
  • 句子2:”我有3年没有换新手机了,还是原来的手机壳”

> txt1<-"我买了一个手机,又配了一个手机壳"
> txt2<-"我有3年没有换新手机了,还是原来的手机壳"

第二步,对上面2个句子进行分词,这里我们使用jiebaR包进行分词,关于jiebaR包的具体用法,请参考文章R语言中文分词包jiebaR


# 加载jiabaR包
> library(jiebaR)

# 定义分词引擎
> wk<-worker()

# 分别对两个文本进行分词
> w1<-wk[txt1]
> w2<-wk[txt2]

第三步,进出所有的词,并查看词频


> w1
 [1] "我"   "买"   "了"   "一个" "手机" "又"   "配"   "了"   "一个" "手机" "壳"  
> w2
 [1] "我"     "有"     "3"      "年"     "没有"   "换"     "新手机" "了"     "还是"   "原来"   "的"    
[12] "手机"   "壳" 

# 查看词频
> table(w1)
w1
  壳   了   买   配 手机   我 一个   又 
   1    2    1    1    2    1    2    1 

> table(w2)
w2
     3     的   还是     换     壳     了   没有     年   手机     我 新手机     有   原来 
     1      1      1      1      1      1      1      1      1      1      1      1      1 

第四步,整理词频为词向量,这里我把生成词向量过程,封装成一个函数叫dfm(),形成单词矩阵。


# 加载工具包
> library(plyr)
> library(magrittr)

# 封装词向量函数
> dfm<-function(w1,w2){
+     t1<-table(w1) %>% ldply
+     t2<-table(w2) %>% ldply
+     names(t1)<-c("seg","cnt1")
+     names(t2)<-c("seg","cnt2")
+     mm<-merge(t1,t2,by="seg",all=TRUE)
+     mm$cnt1[which(is.na(mm$cnt1))]<-0
+     mm$cnt2[which(is.na(mm$cnt2))]<-0
+     list(dat=t(mm[,-1]),seg=mm$seg)
+ }

# 查看词向量的输出结果
> m<-dfm(w1,w2);m
$dat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17]
cnt1    0    0    0    0    1    2    1    0    0     1     2     1     0     2     0     1     0
cnt2    1    1    1    1    1    1    0    1    1     0     1     1     1     0     1     0     1

$seg
 [1] "3"      "的"     "还是"   "换"     "壳"     "了"     "买"     "没有"   "年"     "配"     "手机"  
[12] "我"     "新手机" "一个"   "有"     "又"     "原来"  

第五步,用余弦相似度计算词向量的相似度,即两段文本的余弦相似度。结果是0.4,表示不是太相似。


> library(lsa)
> cosine(m$dat[1,],m$dat[2,]) 
          [,1]
[1,] 0.4036037

那我们换一组句子再试试,比如

  • 句子1:如果这两句话的用词越相似,它们的内容就应该越相似。
  • 句子2:如果这两句话的内容越相似,它们的用词也应该越相似。

用R语言计算上面2个句子的余弦相似度,得0.95,表示非常相似了。


> txt1<-"如果这两句话的用词越相似,它们的内容就应该越相似"
> txt2<-"如果这两句话的内容越相似,它们的用词也应该越相似"
> w1<-wk[txt1]
> w2<-wk[txt2]
> m<-dfm(w1,w2);m
$dat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
cnt1    2    1    1    1    1    1    2    0    1     1     2     1
cnt2    2    0    1    1    1    1    2    1    1     1     2     1

$seg
 [1] "的"     "就"     "两句话" "内容"   "如果"   "它们"   "相似"   "也"     "应该"   "用词"   "越"    
[12] "这"    

> cosine(m$dat[1,],m$dat[2,]) 
     [,1]
[1,] 0.95

本文我们了解余弦相似度的原理和实现,并且应用了余弦相似度计算,从而可以判断两个文本之间的相似程度,让我们进行文本匹配时又多了一种方法。本文代码:https://github.com/bsspirit/r-string-match/blob/main/cosine.r

转载请注明出处:
http://blog.fens.me/r-cosine-similarity/

打赏作者