R包rdist、Python sklearn计算pairwise distance

R包rdist计算pairwise distance

最近想要计算pairwise distance,使用嵌套循环可以解决,但是当矩阵太大的时,就计算慢很多(0.5h到几天的差别)。

1. rdist包介绍

默认使用数字数据,如果使用字符,需要自定义函数,不过可能使运行减慢很多:
rdist包可以计算pairwise distance,支持的距离计算方法有:

"euclidean": sqrt(sum_i((v_i - w_i)^2))
"minkowski": (sum_i(|v_i - w_i|^p))^{1/p}
"manhattan": sum_i(|v_i-w_i|)
"maximum" or "chebyshev": max_i(|v_i-w_i|)
"canberra": sum_i(|v_i-w_i|/(|v_i|+|w_i|))
"angular": arccos(cor(v, w))
"correlation": sqrt((1-cor(v, w))/2)
"absolute_correlation": sqrt((1-|cor(v, w)|^2))
"hamming": sum_i(v_i != w_i)/sum_i(1)
"jaccard": sum_i(v_i != w_i)/sum_i(v_i != 0 or w_i != 0)
Any function that defines a distance between two vectors.
2. 数字型和自定义函数计算字符型距离
## 数字型例子
require(rdist)
a=matrix(c(1,2,3,4,2,3,3,4,3,3,3,3),3)
1-pdist(a,metric="hamming")
1-pdist(a,metric="jaccard")

## 字符型自定义函数(定义剔除NN行的相似性比例)
b=t(matrix(c("CC","DD","CC","DD","NN","AA","CC","NN","BB","CC","DD","AA"),2,byrow = T))
b
myfun=function(v,w){
  idx=intersect(which(v!="NN"),which(w!="NN"))
  x1=v[idx]
  x2=w[idx]
  #x2[8]=10
  dis=sum(x1==x2)/length(x1)
  return(dis)  } 

pdist(t(b),metric = myfun)
     [,1] [,2]
[1,]  1.0  0.5
[2,]  0.5  1.0

b
     [,1] [,2]
[1,] "CC" "CC"
[2,] "DD" "NN"
[3,] "CC" "BB"
[4,] "DD" "CC"
[5,] "NN" "DD"
[6,] "AA" "AA"
3. Python包sklearn中调用pairwise_distances
from sklearn.metrics.pairwise import pairwise_distances
##### pairwise distance example in sklearn
data = pd.read_csv("filename.hmp.txt", header=0, sep="\t") ##  hmp genotype data
print(data.shape)
print(data.iloc[1:5,10:14])

data[data=="AA"]=1
data[data=="GG"]=2
data[data=="CC"]=3
data[data=="TT"]=4

data[data=="AG"]=5
data[data=="GA"]=5
data[data=="AC"]=6
data[data=="CA"]=6

data[data=="AT"]=7
data[data=="TA"]=7
data[data=="TC"]=8
data[data=="CT"]=8

data[data=="TG"]=9
data[data=="GT"]=9
data[data=="CG"]=10
data[data=="GC"]=10

data[data=="NN"]=11

def cal_dis2(n1,n2): ## default X
    x1=n1[(n1 !=11) & (n2 != 11)]
    x2=n2[(n1 !=11) & (n2 != 11)]
    x3=sum(x1==x2)/len(x1)
    return x3

d=pairwise_distances(e1.values.T, metric=cal_dis2,n_jobs=10)

出现的问题是:

1.服务器不能调用指定的cpu个数
2.自定义函数简单,传入pairwise_distances函数时仍然计算很慢,反而默认的方法计算很快。

仅为记录。

参考:
https://www.rdocumentation.org/packages/fields/versions/13.3/topics/rdist
https://scikit-learn.org/0.15/modules/generated/sklearn.metrics.pairwise.pairwise_distances.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
OPTICS算法是基于DBSCAN聚类算法的改进算法,可以用于聚类分析。在Python中,可以使用以下代码实现OPTICS算法: ``` ordered = [] # 用于保存有序的样本 c_dists = [] # 与ordered相对应的核距离 r_dists = [] # 与ordered相对应的可达距离 orderedSeeds = [] orderedSeeds_rdist = [] def optics(X, min_samples, eps): # 实现OPTICS算法的代码逻辑 # 将object加入Ordered_Objects中 ordered_objects.append(object) r_dists.append(r_dist) c_dists.append(c_dist) # 调用optics函数传入数据集X,最小样本数min_samples和邻域半径eps optics(X, 2, 5) ``` 上述代码中,`ordered`保存有序的样本,`c_dists`保存与`ordered`相对应的核距离,`r_dists`保存与`ordered`相对应的可达距离。`orderedSeeds`和`orderedSeeds_rdist`用于其他操作,但在这里并未提及具体用途。你可以根据你的具体需求对这些变量进行进一步操作和分析。在绘制可达距离图时,你可以使用`plt.plot(r_dists)`函数来绘制可达距离的变化曲线。这样就可以实现OPTICS算法的Python实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [聚类分析OPTICS算法python实现](https://download.csdn.net/download/u013161561/10805661)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [OPTICS聚类以及python实现](https://blog.csdn.net/m0_45411005/article/details/123251733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值