在Python中绘制二维矩阵,代码及最有用的可视化方式
我有一个非常大的矩阵(10行55678列),它是用“numpy”格式表示的。这个矩阵的每一行代表一个“主题”,而每一列代表一些单词(这些单词是从文本中提取出来的独特单词)。矩阵中每个位置i,j的值表示单词j属于主题i的概率,也就是说,值x表示这个单词和主题的关系有多强。因为我使用的是ID而不是实际的单词,而且我的矩阵维度非常大,所以我需要找到一种可视化的方法。你建议用简单的图表,还是更复杂、更有信息量的图表呢?(我问这个问题是因为我对有用的可视化类型不太了解)。如果可以的话,能给我一个使用numpy矩阵的例子吗?谢谢。
我问这个问题的原因是我想对我的文本中单词和主题的分布有一个总体的了解。其他任何方法也都欢迎。
2 个回答
关键要考虑的是,你的矩阵在两个方向上是否有重要的结构。如果有,那就可以尝试用彩色矩阵图(比如 imshow)来展示。但如果你的十个主题基本上是独立的,可能更适合做十个单独的折线图或直方图。两种图都有各自的优缺点。
特别是,在完整的矩阵图中,z轴的颜色值并不是特别精确或量化,所以很难看清一些小的趋势波动,或者对变化率进行量化评估等等,这样就会有很大的缺陷。而且,缩放和移动这些图也比较麻烦,因为你可能会迷失方向,无法查看整个图;而在一维图上移动就简单多了。
当然,正如其他人提到的,5万点数据太多了,实际上很难可视化,所以你需要对数据进行排序,或者其他处理,来减少你需要实际查看的数值数量。
不过,实际上,为特定数据集找到合适的可视化方法并不总是简单的。对于大而复杂的数据集,人们会尝试所有可能有帮助的方法,然后选择真正有效的。
你可以使用matplotlib的imshow
或pcolor
方法来显示数据,但正如评论中提到的那样,如果不放大查看数据的某些部分,可能会很难理解。
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
这个包来绘制每个类别的单词聚类,其中概率最高的单词会用更大的节点表示,或者更靠近图的中心,而那些不属于该类别的单词则会被忽略。这样做可能更简单,因为你有很多单词和少量类别。
希望这些建议能对你有所帮助。