세 개의 배열이 있습니다. X, Y, Z라고합시다.
X는 차원 m의 n 배열을 포함합니다. [[x11,x12,...,x1m],[x21,x22,...,x2m],...,[xn1,xn2,...,xnm]]
Y는 차원 m의 k (k> n) 배열을 포함합니다. 즉 [[y11,y12,...,y1m],[y21,y22,...,y2m],...,[yk1,yk2,...,ykm]]
Z는 차원 m의 p (p <k, p <n) 배열을 포함합니다. [[z11,z12,...,z1m],[z21,z22,...,z2m],...,[zp1,zp2,...,zpm]]
배열 Z의 각 요소 Z [i]에 대해 배열 X의 모든 요소까지의 거리 (유클리드)를 계산하고 최소 거리를 선택해야합니다. 이는 dist_X [i]로 표시됩니다. 나는 똑같이해야하지만 배열 Y로 dist_Y [i]로 최소 거리를 표시합니다. 그런 다음 Z의 각 요소 Z [i]에 대해 dist_Y [i] / (dist_Y [i] + dist_X [i])의 값을 계산해야합니다.
나는 다음과 같이 시도했다.
import scipy
from scipy import spatial
def dist_sets(z):
tree_X = spatial.cKDTree(X)
tree_Y = spatial.cKDTree(Y)
dist_X, minid_X=tree_X.query(z)
dist_Y, minid_Y=tree_Y.query(z)
return dist_Y/(dist_Y+dist_X)
print(dist_sets(Z))
그러나 큰 n, k 및 p에 대한 계산 시간이 많이 걸립니다. 예 : (n, m) = (17727, 122), (k, m) = (542273, 122) 및 (p, m) = (140001, 122).
Z의 모든 요소에 대해 dist_sets (Z) 함수를 평가할 수있는 방식으로 Python에서 코드를 최적화하는 방법이 있습니까?
KDTree에 대한 문서는 더 큰 차원에서 성능 이점이 저하된다는 것을 언급합니다. 그중 122 개를 사용하면 순진한 벡터화 솔루션이 더 나을 것입니다. 한 가지 가능성이 있습니다.
from sklearn.metrics import pairwise_distances_argmin_min
def dist_sets2(Z):
iX, dX = pairwise_distances_argmin_min(Z, X)
iY, dY = pairwise_distances_argmin_min(Z, Y)
return dY / (dX + dY)
의 경우를 k = p = 1000
사용하는 것보다 내 컴퓨터에서 17 배 더 빠릅니다 cKDTree
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다