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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

用pytorch及numpy计算成对余弦相似性矩阵,并用numpy实现kmeans聚类

發布時間:2025/3/8 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用pytorch及numpy计算成对余弦相似性矩阵,并用numpy实现kmeans聚类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

??sklearn和scipy里面都提供了kmeans聚類的庫,但是它們都是根據向量直接進行計算歐氏距離、閔氏距離或余弦相似度,如果使用其他的度量函數或者向量維度非常高需要先計算好度量距離然后再聚類時,似乎這些庫函數都不能直接實現,于是我用numpy自己寫了一個,運行也非常快。這里記錄下來以后備用:

import numpy as np import matplotlib.pyplot as plt import time t0 = time.time()Num = 512 corr = np.load('corrs20000.npy') #相關系數矩陣 u = np.arange(Num) #設置初始中心點 #u = np.random.choice(20000,Num,replace=False) for n in range(1000): #設置1000次循環cluster = [[v] for v in u] #每個簇放在一個列表中,總體再有一個大列表存放others = np.array([v for v in range(20000) if v not in u]) #其他未歸類的點temp = corr[:,u]temp = temp[others,:] #通過兩步提取出所有其他未歸類點和各中心點的子相關矩陣inds = temp.argmax(axis=1) #計算每個未歸類點與各中心點的最大關系那個點的序號new_u = []for i in range(Num): #對每個簇分別計算(暫未想到矢量化方法)ind = np.where(inds==i)[0] #提取各簇中所有新點在未歸類點中的序號points = others[ind] #根據序號查找對應的未歸類點實際編號cluster[i] = cluster[i] + points.tolist() #把本簇未歸類點加入到簇中temp = corr[cluster[i],:]temp = temp[:,cluster[i]] #通過兩步計算提取本簇各點子相關矩陣ind_ = temp.sum(axis=0).argmax() #計算各點和其他各點的總相關系數之和,取最大的一個的序號ind_new_center = cluster[i][ind_] #根據序號轉換為實際編號,得到新的本簇中心點new_u.append(ind_new_center) #加入到新中心點向量new_u = np.asarray(new_u,dtype=np.int32)if (new_u==u).sum() == Num: #如果新的中心點向量已不再變化,停止循環breakprint(n,(new_u==u).sum(),time.time()-t0)u = new_u.copy() #計算全部結束后得到cluster就是各簇的點集和,u是中心點向量

--------------------------后續補充:
??然而,快速計算一組向量的自相關性矩陣或者兩組向量的相互成對相關系數矩陣也是很常用的,在pytorch中用torch.cosine_similarity只能計算兩個向量間的,不能批量整體處理,如果循環計算,或者把向量通過repeat方法擴展顯然計算速度比較慢。這里給出一種使用torch.matmul批量計算的方法,可以在cuda中計算,速度非常快。記錄備用:

def pairs_cosineSimilarity_matrix_pytorch(v1,v2):#v.shape = (N, vector_dims)v1 = v1.permute(1,0).unsqueeze(2).float()v2 = v2.permute(1,0).unsqueeze(1).float()part1 = torch.matmul(v1,v2).sum(0)part2 = torch.matmul(v1.pow(2).sum(0).pow(0.5),v2.pow(2).sum(0).pow(0.5))return part1 / (part2+1e-15) 與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的用pytorch及numpy计算成对余弦相似性矩阵,并用numpy实现kmeans聚类的全部內容,希望文章能夠幫你解決所遇到的問題。

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