執筆中の記事で 距離行列 を提示したいので、そのための優れた視覚化を探しています。
これまでのところ、バルーンプロット( ここ を使用しましたが、このケースではうまくいかないと思います)、ヒートマップ( ニースの例 ですが、テーブルに数字を表示することはできません。間違っている場合は修正してください。色のテーブルの半分と数字のある半分はクールかもしれません。最後に相関楕円プロット(ここでは コードと例 -形状を使用するのはクールですが、ここでどのように使用するのかわかりません)。
さまざまなクラスタリング方法もありますが、それらはデータを集約します(これはnot私が望むものです)が、私が望むのはすべてのデータを提示することです。
サンプルデータ:
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist(nba[1:20, -1], )
アイデアを募集しています。
Tal、これはヒートマップ上でテキストをすばやく重ねる方法です。後者はプロットをオフセットするため、これはimage
ではなくheatmap
に依存し、テキストを正しい位置に配置することがより困難になることに注意してください。
正直なところ、このグラフは情報が多すぎるため、読みにくくなっていると思います。特定の値のみを書きたい場合があります。
また、グラフをPDFとして保存し、Inkscape(または同様のソフトウェア)にインポートして、必要に応じてテキストを手動で追加することもできます。
お役に立てれば
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dst <- dist(nba[1:20, -1],)
dst <- data.matrix(dst)
dim <- ncol(dst)
image(1:dim, 1:dim, dst, axes = FALSE, xlab="", ylab="")
axis(1, 1:dim, nba[1:20,1], cex.axis = 0.5, las=3)
axis(2, 1:dim, nba[1:20,1], cex.axis = 0.5, las=1)
text(expand.grid(1:dim, 1:dim), sprintf("%0.1f", dst), cex=0.6)
ボロノイ図(ボロノイ分解のプロット)は、距離行列(DM)を視覚的に表現する1つの方法です。
また、Rを使用して作成およびプロットするのも簡単です。Rコードの1行で両方を実行できます。
計算ジオメトリのこの側面に慣れていない場合、2つの関係(VDとDM)は簡単ですが、簡単な要約が役立つ場合があります。
距離行列-つまり、ポイントと1つおきのポイント間の距離を示す2Dマトリックスは、kNN計算中の中間出力です(つまり、k最近傍、特定のデータポイントの値を予測する機械学習アルゴリズム距離的に「k」の最近傍の加重平均値。「k」は整数で、通常は3〜5です。)
kNNは概念的に非常に単純です-トレーニングセットの各データポイントは本質的にn次元空間の「位置」であるため、次のステップでは、距離メトリックを使用して各ポイントと他のすべてのポイント間の距離を計算します(例: 、ユークリッド、マンハッタンなど)。トレーニングステップ(距離マトリックスの構築)は簡単ですが、新しいデータポイントの値を予測するためにそれを使用することは、データ検索によって実際に妨げられます-数千または数百万の中から最も近い3または4ポイントを見つけるn次元空間に散在しています。
この問題に対処するために、kdツリーとVoroni分解(別名「ディリクレテセレーション」)の2つのデータ構造が一般的に使用されます。
ボロノイ分解(VD)は、距離行列によって一意に決定されます。つまり、1:1マップがあります。確かに、それは距離行列の視覚的表現ですが、これも目的ではありません。その主な目的は、kNNベースの予測に使用されるデータの効率的な保存です。
それ以外に、このように距離行列を表すのが良い考えであるかどうかは、おそらく視聴者に大きく依存します。ほとんどの場合、VDと先行距離マトリックスの関係は直感的ではありません。しかし、それは間違いではありません。統計トレーニングを受けていない人が、2つの母集団の確率分布が似ているかどうかを知りたい場合、Q-Qプロットを見せたら、彼らはおそらくあなたが質問をしていないと思うでしょう。ですから、自分が何を見ているのかを知っている人にとって、VDはコンパクトで完全かつ正確なDMの表現です。
どうやって作るの?
Voronoi decompは、トレーニングセット内から(通常はランダムに)ポイントのサブセットを選択することで構築されます(この数は状況によって異なりますが、1,000,000ポイントがある場合、100はこのサブセットの妥当な数です)。これらの100個のデータポイントは、ボロノイセンター(「VC」)です。
Voronoi decompの背後にある基本的な考え方は、1,000,000個のデータポイントを調べて最近傍を見つけるのではなく、これら100個だけを見るだけでよく、最も近いVCを見つけたら、実際の最近傍の検索はそのボロノイセル内のポイントのみに制限されます。次に、トレーニングセットの各データポイントについて、VCそれが最も近い。計算します。最後に、各VCおよびその関連ポイントについて、凸を計算しますハル-概念的には、VCから最も遠いVCの割り当てられたポイントによって形成される外側の境界のみ。ボロノイ中心の周りのこの凸包は「ボロノイセル」を形成します。完全なVDは、これらの3つのステップをVCトレーニングセット。これにより、表面の完全なテッセレーションが得られます(下図を参照)。
RでVDを計算するには、tripackパッケージを使用します。重要な機能は 'voronoi.mosaic'で、これにx座標とy座標を別々に渡すだけです-生データnotDM-- voronoi.mosaicを 'plot'に渡すだけです。
library(tripack)
plot(voronoi.mosaic(runif(100), runif(100), duplicate="remove"))
また、力指向グラフ描画アルゴリズムを使用して、距離マトリックスを視覚化することもできます。
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
dist_m <- as.matrix(dist(nba[1:20, -1]))
dist_mi <- 1/dist_m # one over, as qgraph takes similarity matrices as input
library(qgraph)
jpeg('example_forcedraw.jpg', width=1000, height=1000, unit='px')
qgraph(dist_mi, layout='spring', vsize=3)
dev.off()
マトリックスの2次元投影(多次元スケーリング)を検討することもできます。 Rで行う方法へのリンク 。
そうでなければ、あなたはヒートマップで正しい軌道に乗っていると思います。難易度を上げずに数字を追加できます。たとえば、off Learn R の構築:
library(ggplot2)
library(plyr)
library(arm)
library(reshape2)
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv")
nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt(nba)
nba.m <- ddply(nba.m, .(variable), transform,
rescale = rescale(value))
(p <- ggplot(nba.m, aes(variable, Name)) + geom_tile(aes(fill = rescale),
colour = "white") + scale_fill_gradient(low = "white",
high = "steelblue")+geom_text(aes(label=round(rescale,1))))
階層クラスター分析に基づいた樹状図は便利です: http://www.statmethods.net/advstats/cluster.html
Rの2次元または3次元の多次元スケーリング分析: http://www.statmethods.net/advstats/mds.html
3次元以上にしたい場合は、ggobi/rggobiを調べてみてください。 http://www.ggobi.org/rggobi/
Borcardらによる本「Numerical Ecology」。 2011年、彼らは* coldiss.rと呼ばれる関数を使用しました*あなたはそれをここで見つけることができます: http://ichthyology.usm.edu/courses/multivariate/coldiss.R
距離を色分けし、非類似度によってレコードを順序付けします。
別の適切なパッケージは、seriationパッケージです。
参照:Borcard、D.、Gillet、F.&Legendre、P.(2011)Numerical Ecology with R. Springer。
多次元スケーリングを使用したソリューション
data = read.csv("http://datasets.flowingdata.com/ppg2008.csv", sep = ",")
dst = tcrossprod(as.matrix(data[,-1]))
dst = matrix(rep(diag(dst), 50L), ncol = 50L, byrow = TRUE) +
matrix(rep(diag(dst), 50L), ncol = 50L, byrow = FALSE) - 2*dst
library(MASS)
mds = isoMDS(dst)
#remove {type = "n"} to see dots
plot(mds$points, type = "n", pch = 20, cex = 3, col = adjustcolor("black", alpha = 0.3), xlab = "X", ylab = "Y")
text(mds$points, labels = rownames(data), cex = 0.75)