資料相似度檢測

2021-10-08 13:41:51 字數 1424 閱讀 5535

上面這個是中文的乙個解釋。

這裡我並不是為了要進行某種相似度函式的解釋,而是說,怎麼來解決我一直困擾的問題。n^2問題。

就是要獲取全部的對比樣本,我應該怎麼做,在大資料環境下,如果上千上萬個樣本,這玩意就更難弄了。

我這裡出現的問題就是,我前面在做這個二進位制程式的比較,然後發現了這麼乙個問題,我使用ssdeep獲取了這個程式的雜湊數值,但是我要獲取其中相似度最高的對,也就是說要進行相似度比較,那麼比較簡答的方法就是兩兩相比,就是這麼簡單嘛。

但是這種方式的複雜度是多少呢,是n(n-1)/2,c n 2問題。演算法的時間複雜度就是o(n^2)問題。

因為使用的是mysql資料庫,我當前沒有對每行記錄進行標記,是否這個樣本已經做了比較(其實這個邏輯好像不難,但是也有點麻煩,得仔細設計)。然後最後圖簡單就是直接重新全部跑,雖然資料可能插不進去,但是每次都是把所有的資料都跑了一邊。

(如果有批量查詢就好了,應該有吧,就是批量查詢是否這些主鍵是否存在)

然後這樣的結果當然是非常不盡人意,最開始的單執行緒操作,之後又是多執行緒操作,改為多執行緒的時候,速度明顯提公升了,但是後來資料量上去了之後,就發現出現的bug是說,資料庫連線太多的錯誤好像。反正就是不太對。

那麼這裡的問題就很明顯了,到底應該怎麼來弄這個東西呢?

之前看過的一些內容的就是利用區域性雜湊的方法來做,但其實我對這個東西看了很多遍之後,反而模糊了。

因為有的文章是說將minhash和lsh組合在一起,但是本身來說,minhash不就是lsh嗎?

所有這裡我非常疑惑。

而且實際情況是,我本身要做的是二進位制程式的程式的相似度比較,我已經通過ssdeep的方法,將這部分內容給凝練出來了。這就非常尷尬了。他最後的,已經是乙個數值了,是不是說這種方法之後還是需要進一步進行操作呢?

(這裡還有乙個問題,ssdeep進行比較的時候是怎麼比較的,我是利用了這個東西的py庫進行比較,並不是非常清楚具體的內容,這裡也是乙個可以改進的地方)

好了,說了這麼多,基本上問題也就大致上清楚了。

lsh和ssdeep,minhash這些東西是什麼關係,是否可以結合。

是否存在其他的解決方案。

[1][2]

文章2是專門解釋lsm和minhash的,解釋的較為基礎且全面,而且他也提到了《海量資料探勘》這本書。

他提出了兩個類別的解決方案。

通過桶的方式,先選擇某些列,然後進行相似度檢測

然後他提出了乙個比較好的出發點,那就是排序演算法。從整體來說,排序演算法的複雜度也是n^2,那麼通過一些手段是可以將這個複雜度將為nlogn。就是從這個認知為出發點,來研究某種演算法。

但是這裡依然要說明,這些演算法並不能得到準確的乙個相似度(某個函式),他們是想辦法給你乙個大致的數值,而這個數值,你可以去作為參考,然後如果你想得到具體的相似度,你還要進行這個過程。但是你要明白,這種方式就已經將那種肯定不相似的給過濾掉了。

那麼其實意義就是,我是要做那種大致的比較,然後能夠節省人力。

相似度演算法之余弦相似度

余弦距離,也稱為余弦相似度,是用向量空間中兩個向量夾角的余弦值作為衡量兩個個體間差異的大小的度量。余弦值越接近1,就表明夾角越接近0度,也就是兩個向量越相似,這就叫 余弦相似性 上圖兩個向量a,b的夾角很小可以說a向量和b向量有很高的的相似性,極端情況下,a和b向量完全重合。如下圖 如上圖二 可以認...

相似度計算之余弦相似度

一 定義及概念 余弦取值範圍為 1,1 求得兩個向量的夾角,並得出夾角對應的余弦值,此余弦值就可以用來表徵這兩個向量的相似性。夾角越小,趨近於0度,余弦值越接近於1,它們的方向更加吻合,則越相似。當兩個向量的方向完全相反夾角余弦取最小值 1。當余弦值為0時,兩向量正交,夾角為90度。因此可以看出,余...

計算向量相似度 余弦相似度

1.余弦相似度可用來計算兩個向量的相似程度 對於如何計算兩個向量的相似程度問題,可以把這它們想象成空間中的兩條線段,都是從原點 0,0,出發,指向不同的方向。兩條線段之間形成乙個夾角,如果夾角為0度,意味著方向相同 線段重合 如果夾角為90度,意味著形成直角,方向完全不相似 如果夾角為180度,意味...