Python中的无监督随机森林相似度

5 投票
2 回答
2798 浏览
提问于 2025-04-18 15:43

我最近又开始研究几年前用R语言做的一个随机森林项目,目的是:

  1. 使用无监督的随机森林生成数据输入的接近度矩阵
  2. 从这个接近度矩阵计算距离矩阵,并传递给基于中位数的聚类算法(PAM)
  3. 利用通过PAM获得的聚类结果,在监督模式下运行随机森林,训练一个新模型。
  4. 用这个模型来预测未来某个时间点的另一个数据集。

我已经把很多项目的工作流程转移到了Python,因为这个语言非常灵活且有趣,但相比于我在R中完成这些任务的方式,我在使用sklearn时还在适应中。现在我遇到的问题是如何生成一个接近度矩阵(或者说一个存放样本之间接近度的容器),以便传递给PAM。我找到了一篇帖子,描述了类似的问题,但我一直找不到实现那个被接受答案的作者所建议的方法。

有没有什么线索可以帮助我实现这个?任何帮助都将非常感激,我也会把这些信息回馈给更大的社区。我知道还有很多其他从R转到Python的人会从这种信息中受益。

提前感谢,如果这是一个简单的解决方案而我却忽略了,请见谅。

2 个回答

0

首先,你可以看看pandas这个工具:http://pandas.pydata.org/。它可以让你的工作轻松很多。

如果你想用Python的数据结构来解决问题,那就得看你是怎么加载数据的,以及之后要怎么处理这些数据(比如,你的PAM方法需要什么)。

存储距离的一种方便方法是使用邻接表。实现这个的方法有很多种。我喜欢用一个哈希表,键是坐标的元组,值是距离。

a = {}
a[(0,1)] = 7
a[(1,5)] = 20
a[(6,1)] = 1

这个方法适用于二维数据,但如果需要处理更高维的数据,只需在键中添加更多的坐标就可以了。

1

你可以使用一个叫做bigrf的R语言包。这个包里有你需要的所有功能。你可以在这里找到它的详细信息:https://cran.r-project.org/web/packages/bigrf/bigrf.pdf

下面是如何在R中使用它的方法:

# load bigrf library
library('bigrf')

# generate synthetic dataset
synthetic.df <- generateSyntheticClass(x)

# create rf model
forest <- bigrfc(synthetic.df$x, synthetic.df$y, trace = 1)

# calculate distances
dist  <- proximities(forest, trace =  2)
dist  <- data.frame(as.matrix(dist))
dist  <- dist[1:nrow(x), 1:nrow(x)]
dist  <- sqrt(1 - dist)

撰写回答