聚类分析与可视化
聚類分析與可視化
——《The Wiley Handbook of Human Computer Interaction》學習心得
小組成員:吳** / 周** / 蔣**
概述
最近,在交互媒體專題設計這門課的課程安排下,我們小組對《The Wiley Handbook of Human Computer Interaction》這本書的第945頁至第966頁部分進行了翻譯和學習。該部分的章節名為 “ Visual Analytics for Comparing Multiple Clustering Results of Bioinformatics Data”,其主要介紹了一款能夠幫助生物學家進行多種聚類結果分析的軟件——XCluSim。在接下來的文章中,我們將分享我們在學習該章節后的收獲和感悟。
什么是聚類分析
百度百科對“聚類分析”一詞是這樣解釋的:聚類分析是指將物理或抽象對象的集合分組為由類似對象組成的多個類的分析過程。簡單地來說,聚類分析就是將一組元數據劃分為多個類或簇,同一個簇中的數據具有很大的相似性,而不同簇中的數據具有較大的差異性。聚類與分類是不同的,因為聚類所要求劃分的類是未知的,這與機器學習中的無監督學習【1】過程相似。也正因為聚類過程是沒有明確方向的,所以不同的聚類方法往往會得到不同的結果,這就要求人們對聚類結果的質量進行量化。目前為止,常用的評價指標包括了Purity(純度)、Entropy(熵)、Accuracy(準確率)、NMI(歸一化互信息)、ARI(調整蘭德指數)【2】等。
XCluSim的誕生
自從Eisen實驗室推廣了微陣列數據的聚類分析和可視化【3】,聚類分析已經廣泛應用于生物信息學界。隨著遺傳探測技術在容量和準確性方面的快速提高,聚類分析在高吞吐量探測技術產生的大數據描述性建模(分割或分區)中發揮著更加重要的作用。但是,對于各種聚類分析算法的結果質量,盡管已經有了一些評價指標,在大多數實際研究項目中,其仍是由經驗人員進行主觀評判的,且往往僅特定于目標應用,并不具有普適性。為了選擇數據集的最佳聚類方法及其參數,研究人員必須運行多個聚類算法并進行比較,而這種比較任務往往是十分苛刻和費力的。于是,為了解決這個問題,該章節的作者們開發了一款專門面向生物信息大數據的聚類結果可視化分析軟件——XCluSim。該軟件基本滿足了以下4個設計目標:
(1)方便在不同層面上對多種聚類結果進行可伸縮的視覺比較;
(2)支持生成多種聚類結果;
(3)促進對各種聚類算法的特性及其結果中參數的理解;
(4)為不同類型的單個聚類結果提供有效的專用可視化。
XCluSim的優勢
很遺憾的是,我們小組并沒有找到獲取XCluSim的途徑,所以我們并沒有親身體驗過XCluSim的強大功能。但是,通過對該章節內容的系統學習,我們已經深刻體會到該系統設計的嚴密性以及豐富的層次性,所以我們希望通過我們的簡單介紹能讓大家對這款軟件有一個初步的了解。
(一)比較多個聚類結果
XCluSim部分工作界面如下:
顯然,上圖一共被分為五個部分:
(a)參數信息視圖,向用戶提供了所有聚類結果的參數概述。該視圖被垂直劃分為多個子視圖,每個子視圖對應單獨的聚類算法。每個子視圖內部又被劃分為多個矩形區域,分別表示該聚類算法的不同參數。
(b)強定向布局概覽,其通過物理距離直觀地展示了各種聚類結果的相似性。在該視圖中,每個聚類算法的結果都被表示為一個嵌入了餅狀圖的節點。其中,聚類結果越相似的節點靠得越近,而餅狀圖則向用戶直觀地展示了集群的數量和大小。
(c)樹狀圖概覽,其功能與強定向布局概覽類似,都是向用戶展示多種聚類結果的整體相似性。不同的是,該概覽使用了更熟悉的可視化組件(即樹狀圖),且相較于強定向布局概覽,它節省了更多的空間而不會出現遮擋。
(d)增強版并行集視圖,其更加詳細地展示了多個聚類結果之間的一致性和不一致性。在并行集視圖中,每一行水平的堆疊條都表示了一種聚類結果,而水平堆疊條中的每個條都表示聚類結果中的一個簇。除此之外,相鄰兩行堆疊條之間還存在許多寬度不一的線條,通過線條相連的簇具有某些相同的“穩定項”,而線條的寬度則表示了該穩定項的大小。用戶可以通過調節視圖底部的直方圖來控制所顯示穩定項的大小范圍。
(e)列表視圖,其通過分組模式和熱圖模式向用戶具體地展示了所訪問聚類結果的詳細信息。在分組模式下,用戶可以查看穩定組的數據;而在熱圖模式下,用戶可以查看原始數據。
(二)查看單個聚類結果
XCluSim部分工作界面如下:
上圖主要組成如下:
(a)樹狀圖與熱圖的組合,用于分層顯示聚類結果。
(b)簇級別的強定向布局,用于顯示同一聚類結果中不同簇之間的相似性,其中的折線表示每個簇中所有成員對象的平均模式。
(c)SOM聚類【4】結果的通用蜂巢狀可視化,其中每個六邊形單元格都表示聚類結果中的一個簇。每個單元格的背景強度代表了相應簇的大小,而中間的折線圖則顯示了聚類成員的平均模式。
(d)可達性圖及OPTICS平行坐標圖,OPTICS會計算每個項的可達性距離。(略,這一塊實在沒看懂…)
(三)小結
通過對以上內容的學習,我們發現整個XCluSim的設計過程基本滿足人們對于視覺信息的搜索認知:先概覽,再縮放和過濾,以及按需獲取詳細信息。這種設計思路是十分值得我們進行借鑒和學習的。另外,XCluSim中對于顏色編碼的使用也十分的巧妙。它使用了一種叫做Tree Colors【5】的顏色編碼策略,它是為樹狀數據設計的,用于表示節點之間的相似性。其基本思路是父節點色調范圍的一部分會通過遞歸的方式分配給它的子節點,這樣就能使具有相同父節點的子節點具有相似的顏色。
拓展延伸
據文章所言,XCluSim可以很好地幫助生物學家挖掘某些基因的表達能力,具體案例包括了諸如闡明鐵氧化酶在新型隱球菌中的作用等。在整個實驗流程中,研究人員利用XCluSim對實驗數據的多種聚類分析結果進行觀察和比較,從中尋找某些比較穩定的簇群,而這些簇群往往代表著某些能夠影響表達的基因序列。因為我們的小組成員都不是從事生物方向的,對于各種生物術語和實驗流程的整體把握度還不夠,所以就不在這里對具體實驗實例進行過多闡述。
因為網上關于XCluSim這款軟件的信息實在少得可憐,我們小組也沒能夠進行具體的嘗試,無法對其作出具體的評估,所以只能在網上尋找一些我們認為能夠幫助讀者理解這篇文章內容的資料。具體內容如下:
(1)使用python演示如何通過聚類分析尋找共表達基因【6】。該文章詳細地介紹了如何模擬數據集,如何使用K-means算法進行聚類分析,如何進行數據提取和可視化等步驟。
聚類模擬過程如下:
(來自 https://commons.wikimedia.org/wiki/File:Kmeans_animation.gif)
(2)一種基于語義的大型圖像集可視化方法【7】。這是IEEE TRANSACTIONS ON VISUALIZATION AND COMPUTER GRAPHICS期刊于2018年發表的一篇文章。雖然該文章主要介紹的是一種針對大型圖像集的可視化方法,但我們認為它的某些設計思想對XCluSim的發展有一定的幫助。該論文所描述的系統使用了星系比喻,其合理地使用各個獨立的星系(如太陽系)來表示不同的簇,而星系中的恒星(如太陽)代表了該星系的特征,星系中的行星(如地球)和其他天體代表了簇中不同的對象個體。簇與簇之間的相似性可以用星系間的距離表示,簇的大小可以用星系的體積表示,簇中各個對象之間的相似性也可以通過空間距離來表示。相較于2D空間,星系比喻所使用的3D空間能夠帶給用戶更加直觀的感受和層次更加豐富的信息,我們相信這種方式能夠更好地幫助XCluSim的用戶理解和分析單個聚類算法的結果。
星系比喻的部分界面如下:
(3)基于MNIST數據集的無監督學習的一種簡單應用——Encoder編碼器【8】。其基本原理實際上就是將高維特征進行壓縮降維編碼,最后直觀地在二維平面或三維空間中顯示數據的聚類情況。
Tensorflow平臺下的具體代碼如下:
import tensorflow as tf import matplotlib.pyplot as pltfrom tensorflow.examples.tutorials.mnist import input_datamnist = input_data.read_data_sets("MNIST_Labels_Images", one_hot=False)# 設置訓練超參數 learning_rate = 0.01 # 學習率 training_epochs = 10 # 訓練次數 batch_size = 256 # 每次訓練的樣本數 display_step = 1 # 多少輪顯示一次結果 n_input = 784 # 輸入數據的維度X = tf.placeholder("float", [None, n_input])# 初始化權重和偏置 n_hidden_1 = 128 n_hidden_2 = 64 n_hidden_3 = 10 n_hidden_4 = 2 weights = {'encoder_h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_1], )),'encoder_h2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2], )),'encoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3], )),'encoder_h4': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4], )),'decoder_h1': tf.Variable(tf.truncated_normal([n_hidden_4, n_hidden_3], )),'decoder_h2': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_2], )),'decoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_1], )),'decoder_h4': tf.Variable(tf.truncated_normal([n_hidden_1, n_input], )), } biases = {'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])),'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])),'encoder_b4': tf.Variable(tf.random_normal([n_hidden_4])),'decoder_b1': tf.Variable(tf.random_normal([n_hidden_3])),'decoder_b2': tf.Variable(tf.random_normal([n_hidden_2])),'decoder_b3': tf.Variable(tf.random_normal([n_hidden_1])),'decoder_b4': tf.Variable(tf.random_normal([n_input])), }def encoder(x):layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']), biases['encoder_b1']))layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']), biases['encoder_b2']))layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']), biases['encoder_b3']))# 為了便于編碼層的輸出,編碼層隨后一層不使用激活函數layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']), biases['encoder_b4'])return layer_4def decoder(x):layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']), biases['decoder_b1']))layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']), biases['decoder_b2']))layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']), biases['decoder_b3']))layer_4 = tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights['decoder_h4']), biases['decoder_b4']))return layer_4# 定義網絡結構 encoder_op = encoder(X) decoder_op = decoder(encoder_op)y_pred = decoder_op y_true = X# 設置損失函數 cost = tf.reduce_mean(tf.pow(y_true - y_pred, 2)) optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)# 開始訓練 with tf.Session() as sess:init = tf.global_variables_initializer()sess.run(init)total_batch = int(mnist.train.num_examples / batch_size)for epoch in range(training_epochs):for i in range(total_batch):batch_xs, batch_ys = mnist.train.next_batch(batch_size) # max(x) = 1, min(x) = 0_, c = sess.run([optimizer, cost], feed_dict={X: batch_xs})if epoch % display_step == 0:print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(c))print("Optimization Finished!")encoder_result = sess.run(encoder_op, feed_dict={X: mnist.test.images})plt.scatter(encoder_result[:, 0], encoder_result[:, 1], c=mnist.test.labels)plt.colorbar()plt.show()聚類結果如下:
結語
總的來說,我們小組在這次學習過程中的收獲還是蠻大的。雖然有些操作在沒有實際嘗試的情況下理解起來比較困難,同時對于一些生物方面的知識的缺乏也對我們造成了一定的困擾,但是這并不妨礙我們學習XCluSim這款軟件所蘊含的設計思想和可視化技巧。我們相信在今后的學習生活中,我們一定會十分感謝這次學習經歷的。
參考
【1】吳恩達 —— 無監督學習
https://blog.csdn.net/qq_29373285/article/details/82529333
【2】聚類分析的評價指標
https://blog.csdn.net/qq_36064669/article/details/82586582
【3】聚類分析和全基因組表達模式的展示
https://www.pnas.org/content/95/25/14863.short
【4】Self Organizing Maps(SOM):一種基于神經網絡的聚類算法
https://www.cnblogs.com/sylvanas2012/p/5117056.html
【5】Tree Colors: Color Schemes for Tree-Structured Data
https://ieeexplore.ieee.org/abstract/document/6875961
【6】基因共表達聚類分析及可視化
https://blog.csdn.net/qazplm12_3/article/details/78904744
【7】A Semantic-based Method for Visualizing Large Image Collections
https://ieeexplore.ieee.org/abstract/document/8358974
【8】Tensorflow在MNIST中的應用
https://blog.csdn.net/hellozex/article/details/78540482
總結
- 上一篇: MENTOR PADS软件菜单显示不完整
- 下一篇: ArcGIS 利用全局(局域)空间自相关