👇 连享会 · 推文导航 | www.lianxh.cn
🍓 课程推荐:连享会:结构模型·2025 现场班 嘉宾:谭用,南京财经大学 时间:2025 年 6 月 7-8 日 咨询:王老师 18903405450(微信)
作者 :梁淑珍 (华侨大学)邮箱 :13514084150@163.com
温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」 。或直接长按/扫描如下二维码,直达原文:
编者按 :本文主要参考自下文「Cosine Similarity Explained using Python」,特此致谢!
目录
1. 余弦相似度原理
2. 计算余弦相似度
3. 计算MDA相似度
4. 相关推文
我们所熟知的智能推荐算法,在很大程度上依赖于能否正确识别一组研究对象或用户之间的相似性。计算相似度的方法有很多,本文主要介绍余弦相似度。
1. 余弦相似度原理 余弦相似度是通过计算两个非零向量的余弦值来衡量它们之间的相似程度,这与内积的计算过程相同。具体来看以下三个向量:
接着,将这三个向量绘制在坐标轴中:
从上图可以看出 比 更接近 ,可以说
与 更相似。那么,我们该如何从数学上度量它们之间的相似性呢?一个直接的方法是通过余弦值来判断两个向量的接近程度,相关计算公式如下:
具体来看,余弦相似度计算过程可分为以下三步:
Step1 :计算点积
其中, 和 分别代表向量 和 的第 个分量。在本例中,向量
和向量 的点积为:
Step2 :计算模长
在本例中,
Step3 :计算余弦相似度
经过计算,向量 与向量 之间的余弦相似度约为 0.976。要注意,相似度的计算具有对称性,即 与 的相似度等价于
与 的相似度。重复上述计算过程,可以得出 和 的余弦相似度值约为 0.740。以上结果和我们看到的结果基本一致。但在大多数情况下,待处理的数据有多个甚至上百个特征,在高维空间中,想要通过可视化判断数据之间的相似程度是不可能的。
2. 计算余弦相似度 在理解了余弦相似度的原理之后,赶紧实操起来吧!例如,现有三种产品,连帽衫、毛衣和短上衣,我们想知道哪两种产品比较相似。其中,这三种产品的长宽数据如下:
Product Width Length Hoodie 1 4 Sweater 2 4 Crop−top 3 2
以上数据集与文章开头使用的数据集完全一致。我们可以通过常识判断,连帽衫和毛衣的相似度更高。利用 Python 计算余弦相似度时,我们需要导入 pandas
和 sklearn
两个模块。首先,将数据导入到数据框中。
import pandas as pd data = {'width' : [1 , 2 , 3 ], 'length'
: [4 , 4 , 2 ]} df = pd.DataFrame (data, columns = ['width' ,'length' ]) print(df)
接下来,使用 sklearn
库中的 cosine_similarity()
方法,算出数据集中每个向量之间的余弦相似度。
from sklearn.metrics.pairwise import cosine_similarity similarity = cosine_similarity(df) print(similarity)
输出结果为二维数组:
[[1. 0.97618706 0.73994007 ] [0.97618706 1. 0.86824314 ] [0.73994007 0.86824314 1. ]]
为了更好地理解这些数字,可以将数组转化为矩阵。
A B C A 1 0.98 0.74 B 0.98 1 0.87 C 0.74 0.87 1
Python 的计算结果与手工计算相同,使用以上代码可以将数据集扩展至更高维度。
3. 计算MDA相似度 以上为英文情境下余弦相似度的计算,接着,我们来看一下中文情境下余弦相似度如何计算。在这里,我们使用到了 CNRDS 数据库中关于 MDA 的 10 个样本数据,如需完整的 MDA 数据请到 CNRDS 数据库中下载。
# 导入包 import pandas
as pdfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.metrics.pairwise import cosine_similarityimport jiebaimport re# 调用数据 data = pd.read_excel("https://file.lianxh.cn/data/m/mda.xlsx" ) stopwords = pd.read_csv("https://file.lianxh.cn/data/c/cn_stopwords.txt" , names=["stopwords" ])# 定义分词函数 def cut_words (text) : words_list = [] text = re.sub("[\W\d]" , "" , text) # 替换符号和数字 words = jieba.lcut(text) for word in words: if word not in list(stopwords["stopwords" ]): words_list.append(word) return " " .join(words_list)# 对文本分词 data["BusDA" ] = data["BusDA" ].apply(cut_words) data# 计算余弦相似度矩阵 vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b" ) vec = vectorizer.fit_transform(data["BusDA" ]) cosine_similarity(vec)
分词后的结果:
余弦相似度矩阵:
array([[1. , 0.3165504 , 0.31895506 , 0.27677875 , 0.33998794 , 0.25348823 , 0.27488111 , 0.29996853 , 0.25345615 , 0.32091215 ], [0.3165504 , 1. , 0.65884621 , 0.52496836 , 0.71573014 , 0.65217931 , 0.61471667 , 0.57745084 , 0.64927521 , 0.67862564 ], [0.31895506 , 0.65884621 , 1. , 0.6071593 , 0.72656538 , 0.74081512 , 0.80501318 , 0.56269624 , 0.69008168 , 0.72926925 ], [0.27677875 , 0.52496836 , 0.6071593 , 1. , 0.50823713 , 0.56432137 , 0.59490604 , 0.46788029 , 0.52515139 , 0.572396 ], [0.33998794 , 0.71573014 , 0.72656538 , 0.50823713 , 1. , 0.67640137 , 0.66767656 , 0.49595091 , 0.63913139 , 0.74228471 ], [0.25348823 , 0.65217931 , 0.74081512 , 0.56432137 , 0.67640137 , 1. , 0.77904189 , 0.54162275 , 0.70334395 , 0.68416732 ], [0.27488111 , 0.61471667 , 0.80501318 , 0.59490604 , 0.66767656 , 0.77904189 , 1. , 0.52515054 , 0.68631957 , 0.63833877 ], [0.29996853 , 0.57745084 , 0.56269624 , 0.46788029 , 0.49595091 , 0.54162275 , 0.52515054 , 1. , 0.55504522 , 0.57993023 ], [0.25345615 , 0.64927521 ,
0.69008168 , 0.52515139 , 0.63913139 , 0.70334395 , 0.68631957 , 0.55504522 , 1. , 0.67550277 ], [0.32091215 , 0.67862564 , 0.72926925 , 0.572396 , 0.74228471 , 0.68416732 , 0.63833877 , 0.57993023 , 0.67550277 , 1. ]])
4. 相关推文 Note:产生如下推文列表的 Stata 命令为: lianxh python, m
安装最新版 lianxh
命令: ssc install lianxh, replace
VaR 风险价值: Stata 及 Python 实现 Python爬虫: 《经济研究》研究热点和主题分析 Python爬虫1:小白系列之requests和json Python爬虫2:小白系列之requests和lxml Python爬虫:爬取华尔街日报的全部历史文章并翻译 Python爬虫:从SEC-EDGAR爬取股东治理数据-Shareholder-Activism Stata交互:Python-与-Stata-对比 Python:拆分文件让百万级数据运行速度提高135倍
Python+Wind:用 Pyautogui 轻松下载 Wind 数据 Python:爬取上市公司公告-Wind-CSMAR Python: 6 小时爬完上交所和深交所的年报问询函 Python: 使用正则表达式从文本中定位并提取想要的内容 Python 调用 API 爬取百度 POI 数据小贴士——坐标转换、数据清洗与 ArcGIS 可视化 Python 调用 API 爬取百度 POI 数据 Python: 批量爬取下载中国知网(CNKI) PDF论文
尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!
New! Stata 搜索神器:lianxh
和 songbl
GIF 动图介绍 搜: 推文、数据分享、期刊论文、重现代码 …… 👉 安装: . ssc install lianxh
. ssc install songbl
👉 使用: . lianxh DID 倍分法
. songbl all
🍏 关于我们 直通车: 👉【百度一下: 连享会 】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。