相似度算法和应用
相似度
- 以圖搜圖
- 均值哈希
- 感知哈希
- 差值哈希
- 漢明距離
- 余弦相似度
- 提取圖片特征的幾個方法
- 例舉
- 文本相似度
- TF-IDF算法
- TF詞頻
- IDF逆文檔頻率
- TF-IDF
- 實現
- 分詞實現
- IDF逆文檔頻率實現
- TF詞頻實現
- TF-IDF實現
- 余弦相似度
- 其他相似度
- 歐拉距離
- L1范數
- L2范數
- Lp范數
- Jaccard相似度
- 寫在后面
- jieba庫
- 深度學習取特征
- 存儲特征向量快速檢索
- 怎么選取相似度算法?
- 更加深入進去
- 推薦系統
- 鑒別盜版視頻
- 項目鏈接
以圖搜圖
許多搜索引擎會提供一個功能,那便是以圖搜圖;顧名思義,輸入一張圖,得到對應的結果。比如找一件衣服的時候,使用文字較為抽象,而圖片則較為直觀。
均值哈希
步驟:
感知哈希
步驟:
差值哈希
步驟:
漢明距離
漢明編碼是與信息位置相關的一種編碼方式;上面的幾種哈希算法最后得到的是漢明編碼,因此可以使用漢明距離來進行相似度的計算。
步驟:
余弦相似度
余弦相似度,是通過計算兩個向量的夾角余弦值來評估他們的相似度。
余弦相似度=cos(θ)=∑i=1nAiBi∑i=1n(Ai)2∑i=1n(Bi)2余弦相似度=cos(\theta) = \frac{\sum_{i=1}^{n}A_{i}B_{i}}{\sqrt{\sum_{i=1}^{n}(A_{i})^2}\sqrt{\sum_{i=1}^{n}(B_{i})^2}} 余弦相似度=cos(θ)=∑i=1n?(Ai?)2?∑i=1n?(Bi?)2?∑i=1n?Ai?Bi??
提取圖片特征信息制作成向量,再使用余弦相似度算法進行計算。
def cosin(v1, v2):# 點乘num = float(np.dot(v1, v2))# np.linalg.norm求范數, 默認是l2范數denom = np.linalg.norm(v1) * np.linalg.norm(v2)# 結果歸一化到[0, 1]區間return 0.5 + 0.5 * (num / denom) if denom != 0 else 0提取圖片特征的幾個方法
給出圖像主題色提取的算法鏈接
例舉
隨意的一種方式,準確率較低。
def feature(imgPath):# 讀取圖片img = cv2.imdecode(np.fromfile(imgPath, dtype=np.uint8), -1)# 轉為設定好的尺寸(32, 32)img = cv2.resize(img, size)# 轉為灰度圖img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 獲取圖片尺寸大小height, width = img.shape# 計算圖片像素平均值feature = []for i in range(height):avg = 0cnt = 0for j in range(width):if img[i][j] == 255:continueavg += img[i][j]cnt += 1feature.append(avg / (cnt if cnt != 0 else 1))return np.array(feature) / 255文本相似度
搜索引擎大家都知道,像Google和百度這樣的搜索引擎是通過關鍵字信息獲取到WWWWWWWWW中對應的文章結果。
TF-IDF算法
關鍵詞提取是文本挖掘領域一個很重要的部分,通過對文本提取的關鍵詞可以窺探整個文本的主題思想,進一步應用于文本的推薦或文本的搜索。TF-IDF則是其中一種提取關鍵詞的算法。
TF詞頻
詞頻(TF)=W在文檔中出現的次數C文檔總詞數S詞頻(TF) = \frac{W在文檔中出現的次數C}{文檔總詞數S} 詞頻(TF)=文檔總詞數SW在文檔中出現的次數C?
IDF逆文檔頻率
逆文檔頻率(IDF)=log(文檔總數D包含W的文檔數N+1)逆文檔頻率(IDF) = log(\frac{文檔總數D}{包含W的文檔數N+1}) 逆文檔頻率(IDF)=log(包含W的文檔數N+1文檔總數D?)
TF-IDF
TF-IDF的公式與信息熵非常相似。關于相對熵與TF-IDF的關系,其實是相對熵可以給以上TF-IDF計算公式在某種特定條件下的一個數學解釋,從相對熵并不能推導出TF-IDF。引用與信息熵與TF-IDF
TF?IDF=詞頻(TF)?逆文檔頻率(IDF)TF-IDF = 詞頻(TF) \cdot 逆文檔頻率(IDF) TF?IDF=詞頻(TF)?逆文檔頻率(IDF)
實現
分詞實現
先使用jieba分詞。
def getJiebaWs(s):# 分詞后的列表ws = []# jieba分詞it = jieba.cut(s)# 存儲分詞結果for w in it:ws.append(w)# 返回分詞列表return wsdef getWords():# 所有文檔的分詞words = []# allWord是所有文檔for word in range(len(allWord)):# word是一篇文檔words.append(getJiebaWs(word))# 返回所有文檔的分詞結果return wordsIDF逆文檔頻率實現
輸入所有分詞好后的文檔。
def idf(words):# idf字典idfFreq = {}# 總文檔數wordsNum = len(words)# 每篇文檔for word in words:# 包含w的文檔數for w in word:# 已經計算w的idf則跳過if w in idfFreq.keys():continue# 記錄w出現在幾篇文檔中cnt = 0for d in words:if w in d:cnt += 1# idf公式idfFreq[w] = np.math.log(wordsNum / (cnt + 1))# 返回idf字典return idfFreqTF詞頻實現
輸入分詞好后的文檔。
def tf(ws):# tf字典tfFreq = {}# 總詞數wsNum = len(ws)# 每個字for w1 in ws:# w1已計算過if w1 in tfFreq.keys():continue# 統計w1在ws中出現的次數cnt = 0for w2 in ws:if w1 == w2:cnt += 1# tf公式tfFreq[w1] = cnt / wsNum# 返回tf字典return tfFreqTF-IDF實現
輸入 TFTFTF 字典和 IDFIDFIDF 字典。
def tfidf(tfFreq, idfFreq):# 詞向量vec = {}# 只記錄有效的詞頻率for k in tfFreq.keys():if k in idfFreq.keys():vec[k] = tfFreq[k] * idfFreq[k]else:vec[k] = tfFreq[k] * 0.0# 返回詞向量return vec余弦相似度
def cosin(serachVec, vec):num = 0.0serachVecNorm = 0.0vecNorm = 0.0# 分子結果for k in serachVec.keys():if k in vec.keys():num += serachVec[k] * vec[k]# 分母結果for k in serachVec.keys():serachVecNorm += serachVec[k] * serachVec[k]for k in vec.keys():vecNorm += vec[k] * vec[k]denom = np.math.sqrt(serachVecNorm) * np.math.sqrt(vecNorm)# 歸一化到[0, 1]return 0.5 + 0.5 * (num / denom) if denom != 0 else 0其他相似度
還有非常多的相似度算法,列舉以下幾個。還有未列舉出來的:皮爾遜相關系數等。
歐拉距離
歐拉距離,來自于歐式幾何,在數學上也可以成為范數。
L1范數
∑i=1n∣xi?yi∣\sum_{i=1}^n|x_i-y_i| i=1∑n?∣xi??yi?∣
L2范數
(∑i=1n∣xi?yi∣2)12(\sum_{i=1}^n|x_i-y_i|^2)^\frac{1}{2} (i=1∑n?∣xi??yi?∣2)21?
Lp范數
(∑i=1n∣xi?yi∣p)1p(\sum_{i=1}^n|x_i-y_i|^p)^\frac{1}{p} (i=1∑n?∣xi??yi?∣p)p1?
Jaccard相似度
用于集合的相似度計算。
S=2?∣X∩Y∣∣X∣+∣Y∣S = \frac{2 \cdot | X \cap Y |}{| X | + | Y |} S=∣X∣+∣Y∣2?∣X∩Y∣?
寫在后面
jieba庫
分析jieba庫源碼,可以知道jieba的IDF語料庫是通過pip一起下來的,在jieba/jieba/analyse/idf.txt中。
jieba是支持獲取TF-IDF的,以上的寫法是為了解原理。
深度學習取特征
目前主流是通過深度學習獲取對應的特征向量,再進行一個相似度的檢測的。
存儲特征向量快速檢索
每次重新計算所有文本或者圖片的特征是非常慢的,因此會使用一些cache技術來達到快速檢索的目的。
怎么選取相似度算法?
通過分析數據之間的信息來選。
例如,為什么圖片hash算法不能用余弦相似度?因為圖片hash算法與位置相關,不能直接拋棄位置信息。
那換種角度去思考,與文本處理類似;每張圖片與所有圖片集都具有一定相關性的時候,或許就可以使用余弦相似度了。比如:深度學習取到的圖片特征向量就可以使用。
更加深入進去
推薦系統
推薦系統必要的一個條件就是需要知道信息與信息之間的相關性。
鑒別盜版視頻
youtobe中使用到了相似度的算法,用于鑒別原版和盜版視頻;大致思路:獲取視頻特征值(應該有做壓縮,或者計算hash),接著進行相似度計算來過濾盜版視頻。
項目鏈接
本篇相似度項目鏈接
總結
- 上一篇: Unity3D ShaderLab 菲涅
- 下一篇: 解构产品经理的技术思维