【问题标题】:plotting a 2D matrix in python, code and most useful visualization在 python、代码和最有用的可视化中绘制二维矩阵
【发布时间】:2011-04-06 01:18:03
【问题描述】:

我有一个“numpy”矩阵格式的非常大的矩阵(10x55678)。该矩阵的行对应于一些“主题”,列对应于单词(来自文本语料库的唯一单词)。这个矩阵中的每个条目 i,j 是一个概率,这意味着单词 j 属于主题 i 的概率为 x。因为我使用的是 id 而不是真实的单词,而且我的矩阵的维度非常大,所以我需要以某种方式对其进行可视化。您建议使用哪种可视化?一个简单的情节?还是更复杂和信息更丰富的?(我问这些是因为我对有用的可视化类型一无所知)。如果可能的话,你能给我一个使用 numpy 矩阵的例子吗?谢谢

我问这个问题的原因是我想大致了解我的语料库中的词-主题分布。欢迎任何其他方法

【问题讨论】:

  • 55678 个单词条目不适合屏幕。您必须告诉我们哪些信息对您很重要。
  • 这个问题有点像“我有 50000 个电话号码。将这些电话号码可视化的最佳方式是什么?”
  • @eumiro:是否可以通过缩放功能使其尽可能紧凑?如果不是,这个矩阵非常稀疏。很多条目都是零,没有给我那么多信息,这有用吗?
  • @Sven Marnach:我只想以直观的方式了解概率分布的整体情况
  • @Hossein:我的意思是你有 55678 个完全不相关的概率分布。尝试同时绘制它们似乎没有多大意义

标签: python numpy matplotlib plot visualization


【解决方案1】:

您当然可以使用 matplotlib 的 imshowpcolor 方法来显示数据,但正如 cmets 所提到的,如果不放大数据子集,可能很难解释。

a = np.random.normal(0.0,0.5,size=(5000,10))**2
a = a/np.sum(a,axis=1)[:,None]  # Normalize

pcolor(a)

然后,您可以按照单词属于某个簇的概率对单词进行排序:

maxvi = np.argsort(a,axis=1)
ii = np.argsort(maxvi[:,-1])

pcolor(a[ii,:])

这里 y 轴上的单词索引不再等于原始排序,因为已经排序。

另一种可能性是使用networkx 包为每个类别绘制词簇,其中概率最高的词由更大或更靠近图表中心的节点表示,并忽略那些具有该类别中没有成员资格。这可能会更容易,因为您有大量的单词和少量的类别。

希望这些建议之一有用。

【讨论】:

  • 对于词频,请尝试使用对数刻度——请参阅Zipf's law
【解决方案2】:

要考虑的关键是矩阵中是否具有重要的两个维度的结构。如果你这样做了,那么值得尝试一个彩色矩阵图(例如,imshow),但如果你的十个主题基本上是独立的,你最好做十个单独的线图或直方图。两种地块都有优点和缺点。

特别是,在全矩阵图中,z 轴颜色值不是很精确或量化,因此很难看到,例如趋势上的小波纹,或变化率的量化评估等,所以这些成本很高。而且它们也更难平移和缩放,因为可能会迷路,因此无法检查整个图,而沿一维图平移是微不足道的。

当然,正如其他人所提到的,50K 点太多而无法实际可视化,因此您需要对它们进行排序或其他方式,以减少您实际需要直观评估的值的数量。

但在实践中,为给定的数据集找到一种好的可视化技术并不总是微不足道的,对于大型和复杂的数据集,人们会尝试所有可能有用的方法,然后选择真正有用的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 2015-05-23
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多