问题标签 [cosine-similarity]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2173 浏览

r - tm.package:findAssocs 与余弦

我是新来的,我的问题是数学而不是编程性质的,我想就我的方法是否有意义获得第二意见。

我试图使用包中的函数来查找我的语料库中单词之间的findAssocs关联tm。尽管它似乎在通过软件包提供的数据(例如纽约时报和美国国会)上表现相当不错,但我对它在我自己的不太整洁的数据集上的表现感到失望。它似乎很容易被包含多个重复相同单词的稀有文档扭曲,这似乎在它们之间建立了强烈的关联。我发现余弦度量可以更好地了解术语的相关性,即使基于文献,它也倾向于用于度量文档的相似性而不是术语。让我们使用RTextTools包中的 USCongress 数据来说明我的意思:

首先,我将设置所有...

假设我们有兴趣研究“政府”和“外国”之间的关系:

现在让我们添加另一个包含重复 50 次“外国政府”的文件:

正如您所看到的,现在这是一个不同的故事,这一切都归结为一个文档。

在这里,我想做一些非常规的事情:使用余弦来查找文档空间中的术语之间的相似性。该度量往往用于查找文档而不是术语之间的相似性,但我认为没有理由不能使用它来查找单词之间的相似性。在传统意义上,文档是向量,而术语是轴,我们可以根据这些文档之间的角度检测它们的相似性。但是术语文档矩阵是文档术语矩阵的转置,同样,我们可以在文档空间中投影术语,即让您的文档成为轴,让您的术语成为您可以测量角度的向量。它似乎没有与简单相关性相同的缺点:

除此之外,这两项措施似乎非常相似:

然而,令人惊讶的是,我还没有看到余弦被用于检测术语之间的相似性,这让我怀疑我是否错过了一些重要的事情。也许这种方法在我没有想到的方面存在缺陷。因此,对我所做的任何想法将不胜感激。

如果你已经做到了,感谢阅读!!

干杯

0 投票
1 回答
2852 浏览

algorithm - Which algorithm/implementation for weighted similarity between users by their selected, distanced attributes?

Data Structure:

Example/Context:

I believe with stack exchange you can have many profiles for one user, as they differ per exchange site? In this problem:

  • Profile: Video, so Video profile only contains Attributes of Video category
  • Attributes, so an Attribute in the Video category may be Genre
  • Attribute Values, e.g. Comedy, Action, Thriller are all Attribute Values

Profiles and Attributes are just ways of grouping Attribute Values on two levels. Without grouping (which is needed for weighting in 2. onwards), the relationship is just User hasMany Attribute Values.

Problem:

Give each user a similarity rating against each other user.

  1. Similarity based on All Attribute Values associated with the user.
    • Flat/one level
    • Unequal number of attribute values between two users
    • Attribute value can only be selected once per user, so no duplicates
    • Therefore, binary string/boolean array with Cosine Similarity?
  2. 1 + Weight Profiles
    • Give each profile a weight (totaling 1?)
    • Work out profile similarity, then multiply by weight, and sum?
  3. 1 + Weight Attribute Categories and Profiles
    • As an attribute belongs to a category, categories can be weighted
    • Similarity per category, weighted sum, then same by profile?
    • Or merge profile and category weights
  4. 3 + Distance between every attribute value
    • Table of similarity distance for every possible value vs value
    • Rather than similarity by value === value
    • 'Close' attributes contribute to overall similarity.
    • No idea how to do this one

Fancy code and useful functions are great, but I'm really looking to fully understand how to achieve these tasks, so I think generic pseudocode is best.

Thanks!

0 投票
1 回答
668 浏览

python - Python - 具有嵌套字典结构的余弦相似度

我正在尝试对不同学生之间的食物量向量进行余弦相似度。我有一个 CSV 文件,其中包含:

以下代码:

给了我这样的结构:

我想将这些字典转换为向量,其中向量的长度是唯一食物的数量,学生不吃的食物将默认为 0,这样:

然后我会在每个学生之间输出一个余弦相似度矩阵。感谢您花时间阅读。任何帮助将不胜感激。

0 投票
2 回答
17899 浏览

python - 计算两个矩阵的余弦相似度

我定义了两个矩阵,如下所示:

现在,我想计算这两个矩阵的余弦相似度。以下代码有什么问题。它给了我一个错误objects are not aligned

0 投票
1 回答
2237 浏览

cluster-analysis - 无法在 JAVA for WEKA 中实现简单 k-means 的余弦相似度

我对 Java 的 ML 的 WEKA API 很陌生。

由于 weka 中没有余弦相似度算法,所以想通过修改 WEKA 的 simpleKmeans 算法,将这个算法加入到 WEKA 中。

weka 中的 simpleKmeans 算法使用EuclideanDistance并且我希望使用余弦相似度而不是 euclideanDistance。

我google了很多关于如何修改simpleKmeans算法的WEKA开源软件代码,在网上发现了这个问题(基本上是pedro的观点)

http://comments.gmane.org/gmane.comp.ai.weka/22681

这里提到的步骤是:

  1. 扩展weka.core.EuclideanDistance并覆盖 distance(Instance first, Instance second, PerformanceStats stats) 方法。

  2. 使用EuclideanDistance类型将其实例化为扩展类,将实例作为扩展类构造函数的参数传递。

  3. 使用传递实例setDistanceFunction的类中的方法。SimpleKMeans
    EuclideanDistance

这是 WEKA 流程第一部分的代码。

但我无法处理接下来的两个步骤,因为我不太熟悉 weka。

我在 weka 中看到了 simpleKmeans 的源代码,并观察到它创建了一个EuclideanDistance类的实例,但我对进一步的过程一无所知。

请帮助我了解接下来要执行的两个步骤。如果余弦相似度的这种实现有错误,请找出答案。此外,如果有人可以为我的余弦实现修改 weka 中的 SimpleKmeans 代码,或者向我解释我应该在该代码中进行更改的地方,那将非常有帮助。

0 投票
2 回答
2819 浏览

python - 余弦相似度 [Python]

使用我的函数的以下代码计算查询与数据的余弦相似度:

我只有下一个理论: 在此处输入图像描述

那么,你能帮我写代码吗?我返回错误的值,我不知道为什么。谢谢。

doc 56 评分结果:

0 投票
1 回答
2138 浏览

algorithm - 如何衡量不同向量空间中余弦相似度得分的优劣?

我是一名计算机科学家,致力于解决需要一些统计措施的问题,但(不是非常精通统计)我不太确定要使用什么统计数据。

概述:

我有一组问题(当然来自 StackExchange 站点),我正在探索算法,这些算法将找到与我提供的问题相似的问题。是的,StackExchange 站点已经执行此功能,许多其他问答站点也是如此。我要做的是分析人们用来完成这项任务的方法和算法,看看哪些方法表现最好。我的问题是找到合适的统计方法来定量确定“哪些方法表现最好”。

数据:

我有一组 StackExchange 问题,每个问题都像这样保存:{'questionID':"...", 'questionText':"..."}. 对于每个问题,我都有一组与之相关的或与之相关的其他问题。StackExchange 网站上的问答者通常会在他们的答案中添加指向其他类似帖子的链接,即“您是否阅读过某某某某的这篇文章 [插入此处发布的链接]?他们正在解决一个类似的问题问题......”我认为这些相关的问题彼此“相似”。

更具体地说,假设我们有 question A。QuestionA有一系列链接的问题{B, C, D}。所以  A_linked = {B, C, D}。我的直觉告诉我,传递性在这里并不适用。也就是说,仅仅因为A与 相似B,并且A与 相似C,我无法确认B与 相似C。(或者我可以吗?)但是,我可以自信地说,如果A类似于B,那么B类似于A

因此,为了简化这些关系,我将创建一组相似的配对:{A, B}, {A, C}, {A, D} 这些配对将作为某种基本事实。这些是我们知道彼此相似的问题,因此它们的相似性置信度值等于 1。所以similarityConfidence({A,B}) = 1

关于这种设置需要注意的是,对于数据集中的每个问题,我们只知道几个类似的问题。我们不知道的是其他一些问题E是否也与A. 可能相似,也可能不相似,我们不知道。所以我们的“基本事实”实际上只是一些事实。

算法:

该算法的简化伪代码版本如下:

所以现在我有了 q 和我的数据集中所有其他问题之间的余弦相似度分数的完整映射。我的最终目标是为vectorize()函数的许多变体运行此代码(每个变体将返回略有不同的向量),并确定哪种变体在余弦分数方面表现最佳。

问题:

所以这是我的问题。怎么办?我如何定量测量这些余弦分数的好坏?

这些是我集思广益的一些测量想法(尽管我觉得它们不完善,不完整):

  • 某种类似于均方根误差 (RMSE) 的误差函数。因此,对于真实相似度列表中的每个文档,累积平方误差(误差大致定义为1-similarities[questionID])。然后,我们将该累积除以相似对的总数*2(因为我们将考虑a->b以及b->a)。最后,我们将取这个误差的平方根。

    • 这需要一些思考,因为这些值可能需要标准化。尽管 的所有变体vectorize()都会产生 0 到 1 范围内的余弦分数,但两个vectorize()函数的余弦分数可能无法相互比较。vectorize_1()每个问题的余弦分数可能通常很高,因此 0.5 的分数可能是一个非常低的分数。或者,vectorize_2()每个问题的余弦分数通常较低,因此 0.5 可能是一个非常高的分数。我需要以某种方式解释这种变化。
    • 另外,我提出了一个误差函数 1-similarities[questionID]。我选择 1 是因为我们知道这两个问题是相似的,因此我们的相似度置信度为 1。但是,余弦相似度得分为 1 意味着这两个问题是相同的。我们并不是说我们的“相关”问题是相同的,只是它们是相似的。这是一个问题吗?  
  • 我们可以找到召回率(返回的相似文档的数量/相似文档的数量),只要我们设置一个阈值,哪些问题我们返回为“相似”,哪些问题不返回。

    • 尽管出于上述原因,这不应该是一个预定义的阈值,similarity[documentID]>7 因为每个vectorize()函数可能返回不同的值。  
  • 我们可以找到recall@k,我们只分析前k 个帖子。

    • 不过,这可能是有问题的,因为我们没有完整的基本事实。如果我们设置,并且我们知道相关的 3 个k=5文档( )中只有 1 个文档( )在前 5 个中,我们不知道其他 4 个最重要的文档实际上是否与我们知道的 3 个相同或更相似,但没有人将它们联系起来。B{B,C,D}A

你还有其他建议吗?如何定量测量哪个vectorize()功能表现最好?

0 投票
1 回答
6736 浏览

python-2.7 - 为什么 scikit-learn 的最近邻似乎没有返回正确的余弦相似距离?

我正在尝试使用 scikit 的最近邻实现从随机值矩阵中找到与给定列向量最近的列向量。

此代码应该找到第 21 列的最近邻居,然后检查这些邻居与第 21 列的实际余弦相似度。

输出看起来像

所以kneighbors的输出既不是余弦距离也不是余弦相似度。是什么赋予了?

另外,顺便说一句,我认为 sklearn 的最近邻实现不是近似最近邻方法,但与我迭代矩阵并检查时得到的结果相比,它似乎没有检测到我的数据集中的实际最佳邻居第 211 列与所有其他列的相似之处。我在这里误解了一些基本的东西吗?

0 投票
3 回答
844 浏览

algorithm - 如何优化查找相似性?

我有一组由浮点向量表示的 30 000 个文档。所有向量都有 100 个元素。我可以通过在它们的向量之间使用余弦度量来比较它们来找到两个文档的相似性。问题是找到最相似的文档需要很长时间。有什么算法可以帮助我加快速度吗?

编辑

现在,我的代码只计算第一个向量和所有其他向量之间的余弦相似度。大约需要 3 秒。我想加快速度;)算法不一定要准确,但应该给出与完整搜索类似的结果。

每个向量的元素之和等于 1。

0 投票
1 回答
68 浏览

cluster-computing - 与名义数据相似度相关系数的最佳方法

我希望有人能帮我解决这个问题(请):我想在一些文章特征(作者、类别、年份、影响因子、引文)之间做相似性,但我不知道如何为名义数据做这件事,因为我可以做余弦相似度的数字特征,但我怎么能做名义上的呢?提前感谢大家!