tSNE
01 Syntax
02 Methods
| Name | Overloads | Summary |
|---|---|---|
| .ctor | 2 | 创建一个 t-SNE 降维器 |
| EffectiveK | 1 | Barnes-Hut 模式下每行实际保留的近邻数量 |
| GetEmbedding | 1 | return current solution |
| InitDataRaw | 1 | this function takes a set of high-dimensional points and creates matrix P from them using gaussian kernel |
| SyncFlatFromY | 1 | 把嵌入结果由锯齿数组同步到一维镜像 |
| SyncYFromFlat | 1 | 把嵌入结果由一维镜像同步回锯齿数组 |
03 Properties
| Name | Overloads | Summary |
|---|---|---|
| nthreads | 1 | 并行计算所使用的线程数量 |
| UseBarnesHut | 1 | 是否启用 Barnes-Hut 近似 |
| theta | 1 | Barnes-Hut 近似阈值 |
| LeafSize | 1 | Barnes-Hut 空间划分树的叶子容量 |
| KNN | 1 | Barnes-Hut 模式下每一行保留的近邻数量 |
| SparseNonZeros | 1 | Barnes-Hut 模式下稀疏概率矩阵的非零条目数量;精确模式下为 0 |
04 Fields
| Name | Overloads | Summary |
|---|---|---|
| mPerplexity | 1 | effective number of nearest neighbors |
| mEpsilon | 1 | learning rate |
| mP | 1 | 联合概率矩阵(精确模式下的稠密 N×N,行主序) |
| mSparseP | 1 | 联合概率矩阵(Barnes-Hut 模式下的稀疏 CSR 表示) |
| mY | 1 | Y is an array of 2-D points that you can plot |
| mYFlat | 1 | Y 的一维行主序镜像,索引为 i * mDim + d |
| mGains | 1 | step gains to accelerate progress in unchanging directions(行主序一维,长度 N*dim) |
| mYStep | 1 | momentum accumulator(行主序一维,长度 N*dim) |
| bhNegF | 1 | Barnes-Hut 模式下的斥力累加器 |
| bhPosF | 1 | Barnes-Hut 模式下的引力累加器 |
| mGrad | 1 | 梯度,行主序一维数组,长度为 N*dim |
| mDim | 1 | dimensionality of the embedding |
| opts | 1 | 并行度封装,随 tSNE.nthreads 一同更新 |
| mThreads | 1 | 实际的并行线程数 |
05 Members
Double, Int32, Double)创建一个 t-SNE 降维器,并行度取当前主机的 CPU 核心数
| Name | Type | Description |
|---|---|---|
perplexity | Double | 困惑度 |
dim | Int32 | 嵌入维度,通常为 2 或 3 |
epsilon | Double | 学习率 |
Double, Int32, Double, Int32, Boolean)创建一个 t-SNE 降维器
| Name | Type | Description |
|---|---|---|
perplexity | Double | 困惑度 |
dim | Int32 | 嵌入维度,通常为 2 或 3 |
epsilon | Double | 学习率 |
nthreads | Int32 | 并行线程数,<= 0 时取当前主机的 CPU 核心数 |
useBarnesHut | Boolean | 是否启用 Barnes-Hut 近似,默认关闭(走精确路径) |
Barnes-Hut 模式下每行实际保留的近邻数量
return current solution
IEnumerable(Of Double()))this function takes a set of high-dimensional points and creates matrix P from them using gaussian kernel
| Name | Type | Description |
|---|---|---|
X | IEnumerable(Of Double()) | - |
把嵌入结果由锯齿数组同步到一维镜像
把嵌入结果由一维镜像同步回锯齿数组
并行计算所使用的线程数量
默认取当前主机的 CPU 逻辑核心数(App.CPUCoreNumbers)。 由于 t-SNE 的 O(N^2) 热循环是内存带宽受限而非算力受限的, 实际的加速比会低于线程数,调低此值有时反而更快。
是否启用 Barnes-Hut 近似
默认关闭,此时走与改造前完全一致的精确稠密路径。 启用之后概率矩阵改为稀疏表示、梯度改用空间划分树做远场近似, 时间与内存复杂度由 O(N^2) 降至 O(N log N) 与 O(N·k), 代价是结果为近似值(由 tSNE.theta 与近邻数控制精度)。
注意:必须在调用 tSNE.InitDataRaw() 或 tSNE.InitDataDist() 之前设置, 因为它决定了概率矩阵的构建方式。
Barnes-Hut 近似阈值
当某个 cell 的角宽度(宽度 / 到质心的距离)小于该阈值时, 就用其质心一次性近似整棵子树。取值越大越快越粗糙,取 0 退化为精确计算, 参考实现中的经验取值为 0.5。仅当 tSNE.UseBarnesHut 为 True 时生效。
Barnes-Hut 空间划分树的叶子容量
叶子内的所有点在遍历时会被其质心所替代,因此这个值越大树越浅、遍历越快, 但近似误差也越大。取 1 时叶子只装一个点,此时把 tSNE.theta 设为 0 即可退化成精确计算。
实测(N=500,随机布局)配分函数 Z 相对于暴力解的相对误差: theta=0.5 时 leaf=1 约 1.2%,leaf=4 约 4.9%,leaf=24 约 7.2%; theta=0 且 leaf=1 时误差为 1e-16(机器精度)。
Barnes-Hut 模式下每一行保留的近邻数量
取 0(默认值)时自动取 3 * perplexity(参考实现的经验取值)。 这个值直接决定稀疏概率矩阵的内存占用 O(N·k),是精度与开销之间最主要的调节旋钮。
Barnes-Hut 模式下稀疏概率矩阵的非零条目数量;精确模式下为 0
稀疏矩阵的内存占用约为 nnz * 12 字节(4 字节列索引 + 8 字节概率值), 调节 tSNE.KNN 时可以据此权衡精度与内存。
effective number of nearest neighbors
learning rate
联合概率矩阵(精确模式下的稠密 N×N,行主序)
联合概率矩阵(Barnes-Hut 模式下的稀疏 CSR 表示)
Y is an array of 2-D points that you can plot
这是嵌入结果的权威存储,tSNE.GetEmbedding() 直接返回其引用, 因此必须始终保持为锯齿数组形态以维持既有的公开语义。 热循环则一律走 tSNE.mYFlat 一维镜像以获得更好的缓存局部性。
Y 的一维行主序镜像,索引为 i * mDim + d
step gains to accelerate progress in unchanging directions(行主序一维,长度 N*dim)
momentum accumulator(行主序一维,长度 N*dim)
Barnes-Hut 模式下的斥力累加器
Barnes-Hut 模式下的引力累加器
梯度,行主序一维数组,长度为 N*dim
dimensionality of the embedding
并行度封装,随 tSNE.nthreads 一同更新
实际的并行线程数