我正在尝试计算熊猫数据框中各列组合之间的余弦相似度。我已经编写了一个自定义函数来计算余弦相似度,现在需要将其应用于每对组合的列。如果用户尚未与之交互,则每一列都包含0;如果用户未与之交互,则每一列均包含1。因此,每一行都包含用户的总观看行为。
当前使用for循环,但是对于较大的数据样本来说太慢了-例如,我当前的样本为3408列x 28000行。
我的猜测是要使用lambda函数,但我不确定如何正确应用它。
初始数据框:
sm_views = pd.read_sql(postgreSQL_select_Query, connection).groupby().size().unstack(fill_value=0)
cos评级功能:
def cos_rating_calculator(x, y):
dot_product = np.dot(x, y)
distance1 = np.sqrt(sum(x))
distance2 = np.sqrt(sum(y))
cos_rating = dot_product / (distance1 * distance2)
return cos_rating
用于计算关联组合的代码:
combinations = list(itertools.combinations(sm_views.columns, 2))
results = []
for a, b in combinations:
association_metric = cos_rating_calculator(sm_views[a], sm_views[b])
results.append((a, b, association_metric))
results.append((b, a, association_metric))
to_matrix = pd.DataFrame(results, columns=['a', 'b', 'association'])
association_matrix = to_matrix.pivot(index='a', columns='b', values='association')
对于较小的数据集,这可以很好地工作,但是当前数据集太大,以至于该方法不可行。我想要的输出是一列x列矩阵,其中列之间的关联度为值。
答案 0 :(得分:0)
import scipy.spatial.distance
result = pd.DataFrame(list(itertools.combinations(sm_views.columns, 2)), columns=['a','b'])
result['association'] = scipy.spatial.distance.pdist(sm_views.T, 'cosine')
在此示例中,sm_view:
col1 col2 col3
0 0 0 0
1 3 4 2
2 1 1 5
我们得到
a b association
0 col1 col2 0.002946
1 col1 col3 0.354058
2 col2 col3 0.414509