Bagaimana cara membuat sebar interaktif PCA dengan Python?

11

The matplotlib perpustakaan sangat mampu tetapi tidak memiliki interactiveness, terutama dalam Jupyter Notebook. Saya ingin baik secara offline merencanakan alat seperti plot.ly .

scottlittle
sumber
3
Saya tidak begitu berpengalaman dengan hal-hal seperti itu, jadi saya tidak bisa menulis jawaban yang baik, tetapi Anda dapat melihat ipywidgets(contoh di github.com/ipython/ipywidgets/blob/master/docs/source/examples / ... ) atau bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

Jawaban:

10

Ada perpustakaan mengagumkan bernama MPLD3 yang menghasilkan plot D3 interaktif.

Kode ini menghasilkan plot interaktif HTML dari set data iris populer yang kompatibel dengan Jupyter Notebook. Ketika kuas dipilih, itu memungkinkan Anda untuk memilih subset data yang akan disorot di antara semua plot. Ketika panah-silang dipilih, ini memungkinkan Anda untuk mengarahkan mouse ke titik data dan melihat informasi tentang data asli. Fungsi ini sangat berguna ketika melakukan analisis data eksplorasi.

impor matplotlib.pyplot sebagai plt
impor numpy sebagai np
impor panda sebagai pd
impor seaborn sebagai sb
impor mpld3
dari plugin impor mpld3
% matplotlib sebaris

iris = sb.load_dataset ('iris')
dari sklearn.preprocessing mengimpor StandardScaler
X = pd.get_dummies (iris)
X_scal = StandardScaler (). Fit_transform (X)

redup = 3
dari impor PCA sklearn.decomposition
pca = PCA (n_components = redup)
Y_sklearn = pca.fit_transform (X_scal)

# Tetapkan beberapa CSS untuk mengontrol label khusus kami
css = "" "
meja
{
  border-collapse: runtuh;
}
th
{
  warna: #ffffff;
  warna latar: # 000000;
}
td
{
  warna latar: #cccccc;
}
meja, th, td
{
  font-family: Arial, Helvetica, sans-serif;
  perbatasan: 1px hitam pekat;
  perataan teks: kanan;
}
"" "

fig, ax = plt.subplots (redup, redup, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
tooltip = [Tidak ada] * redup

N = 200
index = np.random.choice (rentang (Y_sklearn.shape [0]), size = N)

untuk m dalam kisaran (redup):
    untuk n dalam kisaran (m + 1):
        kapak [m, n] .grid (Benar, alfa = 0,3)
        scatter = kapak [m, n]. hamburan (Y_sklearn [indeks, m], Y_sklearn [indeks, n], alpha = .05)

        label = []
        untuk saya dalam indeks:
            label = X.ix [[i],:]. T.astype (int)
            label.columns = ['Baris {0}'. format (X.index [i])]
            labels.append (str (label.to_html ()))

        kapak [m, n] .set_xlabel ('Komponen' + str (m))
        kapak [m, n] .set_ylabel ('Komponen' + str (n))
        #ax [m, n] .set_title ('HTML tooltips', size = 20)

        tooltip [m] = plugins.PointHTMLTooltip (pencar, label,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (ara, tooltip [m])

plugins.connect (ara, plugins.LinkedBrush (pencar)
test = mpld3.fig_to_html (fig = fig)

dengan open ("Output.html", "w") sebagai text_file:
    text_file.write (test)

Lihat beraksi di blog saya .

Pembaruan [9 Juli 2016]: Saya baru tahu bahwa Plot.ly memiliki mode offline dan sekarang open source. Ini memiliki banyak bel dan peluit dipaket, tetapi MPLD3 mungkin masih sesuai dalam beberapa kasus.

scottlittle
sumber
3

Saya lebih suka ini menjadi komentar daripada jawaban, karena maksud saya bukan untuk plug / beriklan, tetapi saya sedang mengerjakan tesis saya yang mungkin menarik bagi Anda karena jenis melakukan apa yang Anda inginkan. Pada kenyataannya itu adalah alat visualisasi pengelompokan, tetapi jika Anda menggunakan k-means dengan k = 1 Anda memiliki plot interaktif di mana Anda dapat mencari istilah, pilih area dan lihat konten setiap node, dan hal-hal lainnya. Lihatlah dan lihat apakah itu cocok untuk Anda!

https://github.com/Lilykos/clusterix

Lilykos
sumber
Keren! Saya akan lihat.
scottlittle
0

Pilihan yang sangat bagus, ...

Dalam kasus saya, saya mencoba untuk merencanakan penunjukan yang serupa berdasarkan keterampilan, di mana keterampilan adalah embed word2vec 300 dimensi; membawanya ke ruang vektor 3 dimensi, dan menggunakan Scatter3D plotly, saya bisa memplot sebar 3D untuk hal yang sama.

Et Viola !! Punya grafik 3 dimensi yang mengagumkan, dengan fungsi melayang dan memperbesar. Dan bagian terbaiknya adalah dapat diekspor sebagai file html, menjadikannya plug and play yang cocok untuk PC lain, cukup seret dan jatuhkan di browser (termasuk dalam kode di bawah).

Adakah yang bisa BEE lagi sederhana

from plotly.offline import plot
from plotly.graph_objs import *
import numpy as np

# x = np.random.randn(2000)
# y = np.random.randn(2000)

# Instead of simply calling plot(...), store your plot as a variable and pass it to displayHTML().
# Make sure to specify output_type='div' as a keyword argument.
# (Note that if you call displayHTML() multiple times in the same cell, only the last will take effect.)

p = plot(
  [
    Scatter3d(x=skills_df[0], y=skills_df[1], z=skills_df[2], text= skills_df['designation'], mode='markers', marker=Marker(color=skills_df['cluster_number'], size=3, opacity=0.5, colorscale='Viridis'))
  ],
  output_type='div'
#   filename='/dbfs/FileStore/tables/lnkdn_jobroles_viridis.html' turn it on to save the file
)
Itachi
sumber