用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)
用pytorch及numpy计算成对余弦相似性矩阵,并用numpy实现kmeans聚类相关推荐
- Pytorch快速计算余弦相似性矩阵
之前一直想找一个可以快速用矩阵相乘(可以直接GPU加速)计算余弦相似性矩阵的代码,总算找到了.代码是在参考代码的基础上进行了一些修改以适配自己的任务. import torchdef calculat ...
- 人工智能学习07--pytorch11--分类网络:使用pytorch和tensorflow计算分类模型的混淆矩阵
师兄说学目标检测之前先学分类 坏了,内容好多!学学学 感谢up主,好人一生平安 混淆矩阵 什么是混淆矩阵: 横坐标:每一列属于该类的所有验证样本.每一列所有元素对应真实类别. 纵坐标:网络的预测类别. ...
- 余弦相似度/卷积核之间的成对余弦相似性
目录 定义: 例子: python函数计算余弦相似性 定义: 余弦距离,也称为余弦相似度,是用向量空间中两个向量之间的夹角余弦值作为衡量两个个体之间的差异大小的度量.(不难理解,余弦相似度就是基于两个 ...
- 两个三维图像互信息python_python – 使用numpy计算成对互信息的最佳方式
对于m×n矩阵,计算所有列(n x n)的互信息的最佳(最快)方式是什么? I(X, Y) = H(X) + H(Y) – H(X,Y) 其中H(X)是指X的香农熵. 目前我正在使用np.histog ...
- Numpy计算三角函数
参考Numpy计算三角函数 - 云+社区 - 腾讯云 numpy可以直接使用 numpy.sin()函数计算三角函数,以sin为例: 计算30度的sin值: import numpy as nprad ...
- pytorch梯度的计算过程
1.基础知识: 与numpy中的基本操作相似, pytorch 的作用是引入GPU加快运算, 增加图形界面, 适合大数据运算, 尤其是deep learning gradient 梯度类似于求导, 找 ...
- python公式计算_Python Numpy计算各类距离的方法
详细: 1.闵可夫斯基距离(Minkowski Distance) 2.欧氏距离(Euclidean Distance) 3.曼哈顿距离(Manhattan Distance) 4.切比雪夫距离(Ch ...
- python3跑通smpl模型_SMPL模型改用python3+numpy计算
SMPL自带的代码是用python2+chumpy,不太方便,还难理解,在github上发现了同样想改用python3+numpy计算的同道中人: https://github.com/Calcife ...
- 相似度计算之(二)——余弦距离
将数据看成空间中的点时,评价远近可以用欧式距离或余弦距离 一般可用于文本间的相似度计算,但也不是绝对的 余弦距离计算步骤: 以余弦距离计算文本相似度为例,具体说明其计算过程: 余弦相似度算法: 一个向 ...
最新文章
- 【论文学习】高频分量有助解释卷积神经网络泛化 High-frequency Component Helps Explain the Generalization of CNN
- ios网址解析中,中文部分如何处理
- spring 动态代理_分析动态代理给 Spring 事务埋下的坑
- Nginx + php-fpm + PHP 5.4 + MySQL 5.5 + Zend
- Android Architecture Components 系列(五)Room
- opera官方教程 团队
- 朗途职业规划之二 基本分析报告 (北森测评)
- 1.6秒能干什么?自动锁螺丝机表演给你看
- JAVA 循环结构while简单方法使用
- Drawio添加自定义图形工具箱
- typora 有道云笔记_利用神器Typora+PicGo,实现有道云不用会...
- docker学习(十二)docker secret 的使用
- 设计模式之九原型模式
- windows常用命令及相关命令
- 2016 LLVM Developers’ Meeting - Experience from Johannes Doerfert, Travel Grant Recipient
- 男神女神配 社区交友网 —— 之 主页 详细解说
- LPC1788 emWin应用笔记
- EMC存储崩溃raid离线恢复数据方法
- 输出100以内的奇数的和
- Mac 安装docker并设置国内镜像源(Docker Desktop 4.0.0)