R语言 执行t-SNE降维后,使用k均值检查每个聚类中哪些要素贡献最大

inb24sb2  于 2023-01-28  发布在  其他
关注(0)|答案(2)|浏览(159)

bounty将在3天后过期。此问题的答案可获得+250声誉奖励。Programming Noob正在寻找来自声誉良好来源的答案:这里的目标是看看每个特征对每个聚类有什么贡献,即使每个聚类中有不同的标签。我的假设是不同的标签有共同的特征,这就是为什么它们聚在一起,比如红色和绿色,所以我想知道这些标签有什么共同的特征,使它们聚在一起。非常感谢。

下面的图显示了t-SNE图。我可以在这里显示它,但遗憾的是,我不能显示标签。有4个不同的标签:

使用名为scores的数据框创建该图,该数据框包含约1100个患者样本及其列所代表的25个特征。该图的标签来自名为metadata的单独数据框。使用scoresmetadata数据框的信息,使用以下代码生成该图。

tsneres <- Rtsne(scores, dims = 2, perplexity = 6)
tsneres$Y = as.data.frame(tsneres$Y)
ggplot(tsneres$Y, aes(x = V1, y = V2, color = metadata$labels)) + 
  geom_point()

我的使命:

我想分析t-SNE图并确定每个聚类中最常见的特征或“得分”矩阵中的列。具体来说,我想了解哪些特征最有助于区分图中出现的不同聚类。是否可以使用替代算法,如PCA,为了完成这项任务,它保留了数据点之间的距离,也许它甚至比t-SNE更好?
这是scores的一个例子,这不是真实的的数据,但很相似:

structure(list(Feature1 = c(0.1, 0.3, -0.2, -0.12, 0.17, -0.4, 
-0.21, -0.19, -0.69, 0.69), Feature2 = c(0.22, 0.42, 0.1, -0.83, 
0.75, -0.34, -0.25, -0.78, -0.68, 0.55), Feature3 = c(0.73, -0.2, 
0.8, -0.48, 0.56, -0.21, -0.26, -0.78, -0.67, 0.4), Feature4 = c(0.34, 
0.5, 0.9, -0.27, 0.64, -0.11, -0.41, -0.82, -0.4, -0.23), Feature5 = c(0.45, 
0.33, 0.9, 0.73, 0.65, -0.1, -0.28, -0.78, -0.633, 0.32)), class = "data.frame", row.names = c("Patient_A", 
"Patient_B", "Patient_C", "Patient_D", "Patient_E", "Patient_F", 
"Patient_G", "Patient_H", "Patient_I", "Patient_J"))

编辑- PYTHON

我也遇到了同样的问题python,我一开始尝试PCA,但是结果很糟糕,所以我先用t-SNE降维,结果更好,然后用k-means聚类,我还是得到了和之前一样的问题,刚才我不介意用R或者python。
这是新的情节:

代码是这样的:

from sklearn.manifold import TSNE
tsne = TSNE(n_components=2, perplexity=30, learning_rate=200)
tsne_result = tsne.fit_transform(scores)

#create a dict to map the labels to colors
label_color_dict = {'label1':'blue', 'label2':'red', 'label3':'yellow', 'label4':'green'}

#create a list of colors based on the 'labels' column in metadata
colors = [label_color_dict[label] for label in metadata[['labels']]

plt.scatter(tsne_result[:, 0], tsne_result[:, 1], c=colors, s=50)
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', marker='o')

# Add labels to the cluster centers
for i, center in enumerate(cluster_centers,1):
    plt.annotate(f"Cluster {i}", (center[0], center[1]), 
                 textcoords="offset points", 
                 xytext=(0,10), ha='center', fontsize=20)
mzsu5hc0

mzsu5hc01#

就像我们思考的食物:把t-SNE维度聚类到可见的聚类中(例如5个聚类),然后把这些信息合并到包含原始变量的原始 Dataframe 中,并尝试训练一个简单的分类算法(例如catboost,以保持其简单和性能合理),分类算法的目标是预测聚类。
最后,您可以使用可解释的人工智能方法(如shapley valuesanchors)来解释模型的决策。
假设您的模型达到了合理的性能,它将为您提供一个与特定集群相关的驱动程序列表。
如果你需要代码方面的帮助,告诉我,希望能有所帮助。

ivqmmu1c

ivqmmu1c2#

也许?使用轮廓得分查找有助于区分聚类的最佳特征。
轮廓得分是通过比较一个聚类的点之间的距离和另一个聚类的点之间的距离来计算的。使用轮廓得分,我可以确定哪些特征对区分聚类最有帮助。

相关问题