TriMap:使用三元组的大规模降维
项目描述
TriMap 是一种降维方法,它使用三元组约束来形成一组点的低维嵌入。三元组约束的形式是“点i比点k更接近点j ”。三元组是从点的高维表示中采样的,并使用加权方案来反映每个三元组的重要性。
与 t-SNE、LargeVis 和 UMAP 等其他降维方法相比,TriMap 提供了更好的数据全局视图。全局结构包括聚类的相对距离、数据中的多个尺度以及可能存在的异常值。我们定义了一个全局分数来量化嵌入的质量,以反映数据的全局结构。
通过 CNN 的 CIFAR-10 数据集(测试集)(n = 10,000,d = 1024):注意 TriMap 揭示的语义结构。
以下实现是在 Python 中。更多细节和更多实验结果可在论文中找到。请参阅示例 colab进行一些分析。
消息!
[2022 年 3 月 16 日] 使用 TriMap JAX 实现的示例 colab现在可在https://github.com/eamid/examples/blob/master/TriMap.ipynb获得。我们使用 t-SNE、UMAP、TriMap 和 PCA 分析 S-curve、MNIST、Fashion MNIST 等的结果。
[2022 年 2 月 17 日] 现已在https://github.com/google-research/google-research/tree/master/trimap上提供了 JAX 实现。更多更新即将推出!
如何使用 TriMap
TriMap 有一个类似于其他 sklearn 库的转换器 API。要使用带有默认参数的 TriMap,只需执行以下操作:
import trimap
from sklearn.datasets import load_digits
digits = load_digits()
embedding = trimap.TRIMAP().fit_transform(digits.data)
要使用预先计算的成对距离矩阵 D 找到嵌入,请将 D 作为输入传递并将 use_dist_matrix 设置为 True:
embedding = trimap.TRIMAP(use_dist_matrix=True).fit_transform(D)
您还可以将预先计算的 k 最近邻及其对应的距离作为元组 (knn_nbrs, knn_distances) 传递。请注意,行必须按顺序排列,从点 0 开始到 n-1。此功能还需要 X 来计算嵌入
embedding = trimap.TRIMAP(knn_tuple=(knn_nbrs, knn_distances)).fit_transform(X)
要计算全局分数,请执行以下操作:
gs = trimap.TRIMAP(verbose=False).global_score(digits.data, embedding)
print("global score %2.2f" % gs)
参数
参数列表如下:
n_dims:嵌入的维数(默认 = 2)
n_inliers:形成最近邻三元组的最近邻数(默认值 = 12)。
n_outliers:形成最近邻三元组的异常值数(默认值 = 4)。
n_random:每个点的随机三元组数(默认值 = 3)。
distance:距离度量('euclidean'(默认),'manhattan','angular'(或'cosine'),'hamming')
weight_temp:应用于权重的对数的温度。更高的温度会产生更紧凑的嵌入。重量温度=0。对应于无转换(默认值=0.5)。
weight_adj(已弃用):对数转换的 gamma 值(默认 = 500.0)。
lr:学习率(默认 = 0.1)。
n_iters:迭代次数(默认 = 400)。
其他参数包括:
knn_tuple:以元组 (knn_nbrs, knn_distances) 的形式使用预先计算的最近邻信息(默认 = 无)
use_dist_matrix:使用预先计算的成对距离矩阵(默认 = False)
apply_pca:如果需要,在应用最近邻搜索之前将数据的维数减少到 100(默认 = True)。
opt_method:优化方法{'sd'(最速下降),'momentum'(带动量的GD),'dbd'(delta-bar-delta,默认)}。
详细:打印进度报告(默认 = False)。
return_seq:存储中间结果并以张量形式返回结果(默认 = False)。
调整这些参数的示例:
import trimap
from sklearn.datasets import load_digits
digits = load_digits()
embedding = trimap.TRIMAP(n_inliers=20,
n_outliers=10,
n_random=10).fit_transform(digits.data)
使用 ANNOY执行最近邻计算。
例子
以下是真实世界数据集的一些结果。最近邻精度和全局分数的值在每个图的顶部显示为一对(NN,GS)。有关更多结果,请参阅我们的论文。
USPS 手写数字(n = 11,000,d = 256)
20 个新闻组(n = 18,846,d = 100)
Tabula Muris ( n = 53,760, d = 23,433 )
MNIST 手写数字(n = 70,000,d = 784)
时尚 MNIST ( n = 70,000, d = 784 )
电视新闻(n = 129,685,d = 100)
下表给出了 t-SNE、LargeVis、UMAP 和 TriMap 在具有 2.6 GHz Intel Core i5 CPU 和 16 GB 内存的单台机器上的 hh:mm:ss 格式的运行时间。我们将每个方法的运行时间限制为 12 小时。此外,UMAP 在大于约 4M 点的数据集上会耗尽内存。
安装
要求:
麻木的
scikit-学习
麻木
惹恼
安装烦人
如果您在使用以下命令在 macOS上安装annoy时遇到问题:
pip3 install annoy
您也可以尝试:
pip3 install git+https://github.com/sutao/annoy.git@master
安装选项
如果您安装了所有要求,则可以使用 pip:
sudo pip install trimap
请定期检查更新并确保您使用的是最新版本。如果您安装了 TriMap 并想升级到较新的版本,您可以使用以下命令:
sudo pip install --upgrade --force-reinstall trimap
另一种方法是使用 anaconda 手动安装依赖项并使用 pip 安装 TriMap:
conda install numpy
conda install scikit-learn
conda install numba
conda install annoy
pip install trimap
对于手动安装,请获取此软件包:
wget https://github.com/eamid/trimap/archive/master.zip
unzip master.zip
rm master.zip
cd trimap-master
安装要求
sudo pip install -r requirements.txt
或者
conda install scikit-learn numba annoy
安装包
python setup.py install
支持和贡献
此实施仍在进行中。非常感谢任何评论/建议/错误报告。请随时通过以下方式与我联系:eamid @ ucsc 。教育_ 如果您想为代码做出贡献,请分叉项目 并向我发送拉取请求。
引文
如果您在出版物中使用 TriMap,请在 arXiv 上引用我们当前的参考资料:
@article{2019TRIMAP, author = {{Amid}, Ehsan and {Warmuth}, Manfred K.}, title = "{TriMap: Large-scale Dimensionality Reduction Using Triplets}", journal = {arXiv preprint arXiv:1910.00204}, archivePrefix = "arXiv", eprint = {1910.00204}, year = 2019, }
执照
请参阅许可证文件。