我有陣列串列,我想計算陣列串列中每個陣列組合的余弦相似度。
我的完整串列包括 20 個陣列,大小為 3 x 25000。下面是一小部分
import pandas as pd
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity,cosine_distances
C = np.array([[-127, -108, -290],
[-123, -83, -333],
[-126, -69, -354],
[-146, -211, -241],
[-151, -209, -253],
[-157, -200, -254]])
D = np.array([[-129, -146, -231],
[-127, -148, -238],
[-132, -157, -231],
[ -93, -355, -112],
[ -95, -325, -137],
[ -99, -282, -163]])
E = np.array(([[-141, -133, -200],
[-132, -123, -202],
[-119, -117, -204],
[-107, -210, -228],
[-101, -194, -243],
[-105, -175, -244]]))
ArrayList = (C,D,E)
我的第一個問題是我得到每個陣列的每個元素的成對結果,但是,我想要實作的是將陣列視為一個整體的結果。
例如我嘗試
scores = cosine_similarity(C,D)
scores
array([[0.98078461, 0.98258287, 0.97458466, 0.643815 , 0.71118811,
0.7929595 ],
[0.95226207, 0.95528395, 0.9428837 , 0.55905221, 0.63291722,
0.7240552 ],
[0.9363733 , 0.93972303, 0.9255921 , 0.51752531, 0.59402196,
0.68918496],
[0.98998438, 0.98903931, 0.99377116, 0.85494921, 0.8979725 ,
0.9449272 ],
[0.99335622, 0.99255262, 0.99635952, 0.84106771, 0.88619755,
0.93616556],
[0.9955969 , 0.99463213, 0.99794805, 0.82706302, 0.8738389 ,
0.92640196]])
我期望的是一個奇異值 0.989...(這是一個虛構的數字)下一個挑戰是如何遍歷我的陣列串列中的每個陣列以獲得陣列的成對結果,如下所示
C D E
C 1.0 0.97 0.95
D 0.97 1.0 0.96
E 0.95 0.95 1.0
作為 python 的初學者,我不知道如何繼續。任何幫助表示贊賞。
uj5u.com熱心網友回復:
如果我理解正確,您要做的是在將每個矩陣用作1Xn維度向量時獲得余弦距離。在我看來,最簡單的事情是用 numpy 函式矢量實作余弦相似度。提醒一下,給定兩個一維向量x和y,余弦相似度由下式給出:
cosine_similarity = x.dot(y) / (np.linalg.norm(x, 2) * np.linalg.norm(y, 2))
要使用這三個度量來做到這一點,我們將首先將它們展平為 1D 表示并將它們堆疊在一起:
matrices_1d = temp = np.vstack((C.reshape((1, -1)), D.reshape(1, -1), E.reshape(1,-1)))
現在我們有了每個矩陣的向量表示,我們可以使用np.linalg.norm(在此處閱讀此函式)計算 L2 范數,如下所示:
norm_vec = np.linalg.norm(matrices_1d , ord=2, axis=1)
最后,我們可以計算余弦距離如下:
cos_sim = matrices_1d .dot(matrices_1d .T) / np.outer(norm_vec ,norm_vec)
# array([[1. , 0.9126993 , 0.9699609 ],
# [0.9126993 , 1. , 0.93485159],
# [0.9699609 , 0.93485159, 1. ]])
請注意,作為完整性檢查,對角線值為 1,因為向量與其自身的余弦距離為 1。
余弦距離如果定義為1-cos_sim并且很容易計算一旦你有相似性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/449875.html
上一篇:如何有效地檢查兩列的條件并在python中對第三列執行操作
下一篇:用特定形式重塑陣列
