关于自监督学习R矩阵变换及SSC库中距离矩阵变换逻辑的技术问询
关于半监督学习R语言SSC库中距离矩阵变换逻辑的技术问询
嘿,刚好对这个变换门儿清,来给你掰扯清楚这段SSC库代码里的门道:
首先先把你提到的核心代码拎出来:
ktrain <- as.matrix(exp(- 0.048 * dtrain^2)) kitest <- as.matrix(exp(- 0.048 * ditest^2))
这里的dtrain/ditest应该是你预先计算好的样本间欧氏距离矩阵对吧?这个变换可不是随便写的,是半监督学习里常用的径向基函数(RBF)核操作,咱们拆成两点说透逻辑:
一、为什么用「平方项+指数函数」的组合?
- 从“差异”转“相似”:欧氏距离本身是用来衡量样本间差异的,但半监督学习(尤其是SSC依赖的图半监督方法)更需要样本间的相似性——这个组合刚好能把距离转成(0,1]区间的相似性得分:距离越近的样本,计算后的值越接近1;距离越远的,值越趋近于0,完美契合算法传递标签信息的需求。
- 强化区分度+高维映射:给距离加平方,能放大近邻样本的差异(近的样本差异被缩小,远的样本差异被放大);再套上负指数,一方面把数值锁在稳定的区间里,避免极端值干扰,另一方面相当于把原始数据映射到了高维特征空间,让原本线性不可分的数据变得更容易被模型处理。
- 0.048的作用:这个是核宽度参数(常叫gamma),用来控制相似性的衰减速度——值越大,相似性随距离增加掉得越快,模型会只盯着离得极近的样本;值越小,衰减越慢,会把稍远的样本也纳入相似性考虑。
二、换成曼哈顿距离还能这么用吗?
完全可以!这个变换的核心是「把距离转成相似性」,和用哪种距离度量无关:
- 如果你用曼哈顿距离(L1距离),常规写法是
exp(-gamma * ditest)(不用平方也可以,因为L1距离本身的线性趋势就足够区分,当然你要是想强化区分度,加平方也没问题) - 注意:曼哈顿距离的数值尺度和欧氏距离不一样,所以你不能直接复用0.048这个参数,得重新调整gamma值,才能得到合适的相似性衰减效果。
最后补一句:SSC库用这个变换,大概率是为了构建样本相似性图——半监督学习里很多算法都是靠这个图,把有标签样本的标签信息“扩散”到无标签的样本上,这个RBF变换是构建这种图的经典操作哦!




