【发布时间】:2021-10-10 02:03:22
【问题描述】:
我正在计算一个相似度矩阵,结果非常大,我想减小大小。
这是我现有的代码:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
from sql_con import get_con
df = pd.read_csv('test.csv')
df = df[['id','value1', 'value2']]
df = df.set_index('id')
sim= squareform(pdist(df, metric='cosine'))
sim_df= pd.DataFrame(sim,columns = df.index,index = df.index)
table= sim_df.unstack()
table.index.rename(['id_1', 'id_2'], inplace=True)
table= table.to_frame('distance')
table.reset_index(inplace=True)
结果数据表如下所示
id_1 id_2 distance
a b 0.1
a c 0.2
为了减小大小,对于矩阵中的每个元素/id,我只想取前 n 个(例如 10 个)最接近/最相似的元素,实际上这实际上意味着获得最小的 10 个。
一旦数据位于数据框“表”变量中,我曾尝试减小数据的大小,但由于 pandas 的工作方式,为减小数据大小而采取的任何步骤都会增加/增加内存使用量。出于这个原因,我想看看当它仍然是一个 numpy 数组(变量“sim”)时,减少数据大小的选项是什么。
什么是一种有效的(就内存和时间而言)方法来减少这个矩阵的大小,只为每个 id 取前 n 个最接近的 id。
【问题讨论】:
-
看来你在找
np.argpartition -
您打算如何使用“紧凑”矩阵?据我了解,您目前有一个以对称矩阵编码的映射
(Element,OtherElement)->Similarity,并且您想要一个对Rank有效的映射(Element, Rank)->(OtherElement,Similarity)在1 到10 之间。理解正确吗? -
理想情况下,我想从对称矩阵转到像上面添加的那样的 id 成对距离表
-
你好@MustardTiger,我已经更新了我的答案,为你提供了一个 id 成对距离表,就像你更新的问题一样。
标签: python arrays pandas dataframe numpy