def computeProbabilities(X, perplexity=30.0, tolerance=1e-5):
#Perform an initial dimensionality reduction
pca = PCA(n_components=50)
X = pca.fit_transform(X)
numSamples = X.shape[0]
P = np.zeros((numSamples, numSamples))
D = pairwise_distances(X, squared=True)
for i in range(numSamples):
indices = np.concatenate((np.arange(i), np.arange(i + 1, numSamples)))
distancesFromI = D[i, indices]
sigma = binarySearch(computePerplexity, distancesFromI, tolerance, perplexity)
precision = 1.0 / sigma
#Compute a "row" of matrix P: the probabilities wrt point I
PwrtI = np.exp(- distancesFromI * precision)
PwrtI /= sum(PwrtI)
#Insert an element corresponding to I wrt I
PwrtI = np.concatenate((PwrtI[0:i], [0.0], PwrtI[i:numSamples]))
#Insert the row
P[i, :] = PwrtI
return P
评论列表
文章目录