日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

相似度算法和应用

發布時間:2025/3/15 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 相似度算法和应用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相似度

  • 以圖搜圖
    • 均值哈希
    • 感知哈希
    • 差值哈希
    • 漢明距離
    • 余弦相似度
      • 提取圖片特征的幾個方法
        • 例舉
  • 文本相似度
    • TF-IDF算法
      • TF詞頻
      • IDF逆文檔頻率
      • TF-IDF
      • 實現
        • 分詞實現
        • IDF逆文檔頻率實現
        • TF詞頻實現
        • TF-IDF實現
    • 余弦相似度
  • 其他相似度
    • 歐拉距離
      • L1范數
      • L2范數
      • Lp范數
    • Jaccard相似度
  • 寫在后面
    • jieba庫
    • 深度學習取特征
    • 存儲特征向量快速檢索
    • 怎么選取相似度算法?
    • 更加深入進去
      • 推薦系統
      • 鑒別盜版視頻
      • 項目鏈接

以圖搜圖

許多搜索引擎會提供一個功能,那便是以圖搜圖;顧名思義,輸入一張圖,得到對應的結果。比如找一件衣服的時候,使用文字較為抽象,而圖片則較為直觀。

均值哈希

步驟:

  • 讀取圖片
  • 圖片尺寸縮放為 32?3232 * 3232?32
  • 轉灰度圖
  • 計算得到平均值 xxx
  • img[i,j]≤ximg[i, j]\leq{x}img[i,j]x 的置為 000,否則置 111
  • def avgHash(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# 計算圖片像素平均值avg = 0for i in range(height):for j in range(width):avg += img[i][j]avg /= (height * width)# 二值化, 計算均值hashhkey = ""for i in range(height):for j in range(width):if img[i][j] <= avg:hkey = hkey + "0"else:hkey = hkey + "1"return hkey

    感知哈希

    步驟:

  • 讀取圖片
  • 圖片尺寸縮放為 32?3232 * 3232?32
  • 轉灰度圖
  • dctdctdct 變換,將圖片轉到頻域
  • 取圖片左上角的低頻 8?88*88?8 部分,計算得到平均值 xxx
  • 左上角的低頻 8?88*88?8 部分的 img[i,j]≤ximg[i, j]\leq{x}img[i,j]x 的置為 000,否則置 111
  • def dctHash(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)# dct變換img = cv2.dct(np.array(img, np.float32))# 獲取圖片尺寸大小height, width = img.shapeheight //= 4width //= 4# 計算圖片像素平均值avg = 0for i in range(height):for j in range(width):avg += img[i][j]avg /= (height * width)# 二值化, 計算均值hashhkey = ""for i in range(height):for j in range(width):if img[i][j] <= avg:hkey = hkey + "0"else:hkey = hkey + "1"return hkey

    差值哈希

    步驟:

  • 讀取圖片
  • 圖片尺寸縮放為 32?3332 * 3332?33
  • 轉灰度圖
  • img[i,j]≤img[i,j+1]img[i,j] \leq img[i, j+1]img[i,j]img[i,j+1] 則置為 111,否則置為 000
  • def differenceHash(imgPath):# 讀取圖片img = cv2.imdecode(np.fromfile(imgPath, dtype=np.uint8), -1)# 轉為設定好的尺寸(32, 32+1)img = cv2.resize(img, (size[0], size[1]+1))# 轉為灰度圖img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)# 獲取圖片尺寸大小height, width = img.shape# 計算差值hashhkey = ""for i in range(height):for j in range(width-1):if img[i][j] <= img[i][j+1]:hkey = hkey + "0"else:hkey = hkey + "1"return hkey

    漢明距離

    漢明編碼是與信息位置相關的一種編碼方式;上面的幾種哈希算法最后得到的是漢明編碼,因此可以使用漢明距離來進行相似度的計算。

    步驟:

  • 進行異或運算C=A^B
  • 統計C中1的個數
  • def hamming(s1, s2):if len(s1) != len(s2):raise Exception("{0} len({1}) != {2} len({3})".format(s1, len(s1), s2, len(s2)))slen = (len(s1) + len(s2)) / 2.0return 1.0 - sum([ch1 != ch2 for ch1, ch2 in zip(s1, s2)]) / slen

    余弦相似度

    余弦相似度,是通過計算兩個向量的夾角余弦值來評估他們的相似度。

    余弦相似度=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

    提取圖片特征的幾個方法

  • 深度模型特征提取層的作為特征向量
  • 使用K聚類等算法拿到特征向量
  • 自定義自己的算法,比如簡單縮放圖片尺寸 32?3232 * 3232?32 后,取每行像素的平均值
  • SIFT、HOG、SURF、ORB、LBP、HAAR,這些方式或許不需要用余弦相似度
  • 給出圖像主題色提取的算法鏈接

    例舉

    隨意的一種方式,準確率較低。

    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)=SWC?

    IDF逆文檔頻率

    逆文檔頻率(IDF)=log(文檔總數D包含W的文檔數N+1)逆文檔頻率(IDF) = log(\frac{文檔總數D}{包含W的文檔數N+1}) (IDF)=log(WN+1D?)

    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 words

    IDF逆文檔頻率實現

    輸入所有分詞好后的文檔。

    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 idfFreq

    TF詞頻實現

    輸入分詞好后的文檔。

    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 tfFreq

    TF-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=1n?xi??yi?

    L2范數

    (∑i=1n∣xi?yi∣2)12(\sum_{i=1}^n|x_i-y_i|^2)^\frac{1}{2} (i=1n?xi??yi?2)21?

    Lp范數

    (∑i=1n∣xi?yi∣p)1p(\sum_{i=1}^n|x_i-y_i|^p)^\frac{1}{p} (i=1n?xi??yi?p)p1?

    Jaccard相似度

    用于集合的相似度計算。
    S=2?∣X∩Y∣∣X∣+∣Y∣S = \frac{2 \cdot | X \cap Y |}{| X | + | Y |} S=X+Y2?XY?

    寫在后面

    jieba庫

    分析jieba庫源碼,可以知道jieba的IDF語料庫是通過pip一起下來的,在jieba/jieba/analyse/idf.txt中。

    jieba是支持獲取TF-IDF的,以上的寫法是為了解原理。

    深度學習取特征

    目前主流是通過深度學習獲取對應的特征向量,再進行一個相似度的檢測的。

    存儲特征向量快速檢索

    每次重新計算所有文本或者圖片的特征是非常慢的,因此會使用一些cache技術來達到快速檢索的目的。

    怎么選取相似度算法?

    通過分析數據之間的信息來選。

    例如,為什么圖片hash算法不能用余弦相似度?因為圖片hash算法與位置相關,不能直接拋棄位置信息。

    那換種角度去思考,與文本處理類似;每張圖片與所有圖片集都具有一定相關性的時候,或許就可以使用余弦相似度了。比如:深度學習取到的圖片特征向量就可以使用。

    更加深入進去

    推薦系統

    推薦系統必要的一個條件就是需要知道信息與信息之間的相關性。

    鑒別盜版視頻

    youtobe中使用到了相似度的算法,用于鑒別原版和盜版視頻;大致思路:獲取視頻特征值(應該有做壓縮,或者計算hash),接著進行相似度計算來過濾盜版視頻。

    項目鏈接

    本篇相似度項目鏈接

    總結

    以上是生活随笔為你收集整理的相似度算法和应用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。