原創|使用教程|編輯:鄭恭琳|2016-05-25 18:03:18.000|閱讀 415 次
概述:聚類是根據相關的個別項目自動分組數據的過程。作為一種無監督算法,其廣泛應用于數據挖掘、機器學習、B.I.(商業智能)應用程序。下面我將為大家親試講解TeeChart如何執行數據“集群”,并使用圖表“Tool”組件來選擇性地可視化結果。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
TeeChart Pro包括類和組件來執行數據“集群”,并使用圖表“Tool”組件來選擇性地可視化結果。
聚類是根據相關的個別項目自動分組數據的過程。
作為一種無監督算法,其廣泛應用于數據挖掘、機器學習、B.I.(商業智能)應用程序。
一個可執行的例子:
›› 點擊下載完整資源TeeChart_Clustering.zip
聚類算法可以處理自定義數據,而不一定非得是TeeChart“Series”數據。
VCL和Firemonkey 的TeeClustering.pas單位包含抽象的“engine”類,執行聚類算法。
這里提供三種不同的聚類方法:
這些類都來自一個共同的抽象類:TBaseClustering。
每個聚類方法都有自己的屬性,確定如何計算集群。計算之后,您可以訪問集群屬性,這是TList TCluster對象。
TCluster包含子集群(Items[ ]),所以您可以檢查哪些輸入的數據項屬于集群,或在等級類型的情況下,訪問樹形結構(集群和子集群)。
上面的類不包含輸入的數據(您自己的數據)。
數據通過一個“provider”類傳遞給聚類引擎。目前有一種數據提供者(TSeriesProvider)集群XY或XYZ系列點。
這個類在TeeClusteringTool.pas單位實現,連同一個圖表工具類(TClusteringTool)使操作更容易也更自動化。
示例運行時代碼(也可以在設計時運行,無需編碼):
uses TeeClusteringTool; var tool : TClusteringTool; tool:=TClusteringTool.Create(Self); tool.ParentChart:=Chart1; tool.Series:=Series1; // your series tool.Method:=cmKMeans; tool.KMeans.NumClusters:=5; tool.Execute;
執行后,您可以在生成的輸出集群進行循環,例如:
var t : Integer; for t:=0 to tool.Clusters.Count-1 do Memo1.Lines.Add( ‘Cluster: ‘+IntToStr(t)+’ contains: ‘+ IntToStr(tool.Clusters[t].Count)+’ points’ );
該工具使用選擇的方法和參數自動執行集群,并可選擇性地用不同顏色來描繪每個源系列點,顯示他們所屬的集群,同時或者在每組集群項目的周邊繪制多邊形,等等。
屬性:
ClusteringTool1.Method := cmHierarchical; ClusteringTool1.ColorEach := True; // paint Series with one color per cluster ClusteringTool1.ShowBounds := True; // draws convex polygons bounding each cluster points ClusteringTool1.Centers.Visible := True; // shows cluster centers ClusteringTool1.Centroids.Visible := True; // shows cluster centroids
其他屬性包括涂刷、畫筆和透明度,在繪制集群多邊形邊界時使用。
方法:
這里提供一些輔助方法:
// Obtain cluster’s center and centroid XY points in Series scales: var P : TPointFloat; P:=ClusteringTool1.GetClusterCenter( ClusteringTool1.Clusters[3] ); P:=ClusteringTool1.GetClusterCentroid( ClusteringTool1.Clusters[2] ); // Obtain an array of XY points (in screen pixel coordinates), that belong to cluster: var PP : TPointArray; ClusteringTool1.GetClusterPoints( ClusteringTool1.Clusters[4], PP); … PP:=nil; // Get cluster statistics: var S : TClusterStats; S:=ClusteringTool1.GetStats( ClusteringTool1.Clusters[0] );
每一個聚類算法需要不同的參數:
K-Means:
ClusteringTool1.KMeans.NumClusters := 10; // Number of minimum clusters (“K”) ClusteringTool1.KMeans.MaxIterations := 1000; // Maximum number of iterations before stopping
Hierarchical:
ClusteringTool1.Hierarchical.NumClusters := 8; // Number of tree root clusters
QT:
ClusteringTool1.QTClustering.MinCount := 30; // Minimum number of points to form a cluster ClusteringTool1.QTClustering.MaxDiameter := 100; // Maximum “diameter” a cluster can grow
距離
集群計算是基于數據項和其他數據項之間的“距離”。有幾種方法來計算項目之間的“距離”。
算法是不可知論者,它們調用Provider(例如:Series provider)來獲得距離。
例如,在XY散點圖上,點之間的距離可以像是斜邊(畢達哥拉斯定理),也就是說,點XY和另一個XY之間的簡單的歐幾里得距離(歐氏距離)。
距離計算的實現:
例子:
ClusteringTool1.Distance := dmMinkowski; ClusteringTool1.MinkowskiLambda := 4;
鏈接
當一個或兩個集群有一個以上的項目時,有多種方法可以計算集群之間的“距離”。
這就是所謂的“鏈接”。
最簡單的方法是使用每個集群“中心”(這意味著沒有發生聯系)。
其他鏈接方式的實現:
lmSingle
也被稱為“minimum”。
集群A和B之間的距離是集群A的所有項目和集群B的所有項目之間的最小距離。
lmComplete
也稱為“maximum”。
集群A和B之間的距離是集群A的所有項目和集群B的所有項目之間的最大距離。
lmAverage
集群A和B之間的距離是集群A的所有項目和集群B的所有項目之間的平均距離。
lmWard
當添加集群B項目到集群A時,其結果是增加“誤差平方和”。
計算速度
集群的本質是一個緩慢的過程。每個聚類方法有不同的性能瓶頸,與輸入數據項的數量成正比。
TeeClustering.pas單位大大地調整優化了每個算法的速度,即使很多工作是需要找到更先進的技術,需要更少的CPU周期。
當多個cpu可以一起使用時,QT閾值算法有著并行性的好處。
速度的例子(重新審視):
(Time in milliseconds, Windows 8.1 x64 on Intel i7 4770 @ 3.4Ghz)
IDE XE8 Delphi, Win32, 5000 data points
Algorithm | Single CPU | Multiple CPU |
---|---|---|
K-Means | 47 | 31 |
Hierarchical | 4328 | 4156 |
QT | 2859 | 703 |
注釋:
x64位可執行文件速度稍快于32位。
速度也非常依賴“距離”的計算方法,用于比較數據。由于其計算了兩個數據XY值對之間的斜邊,默認的歐幾里得計算有一個相當大的CPU成本。
》》》
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:慧都控件網