Як зробити інтерактивний розсіювач PCA в Python?


11

Бібліотека matplotlib дуже здатна, але їй не вистачає інтерактивності, особливо всередині Jupyter Notebook. Я хотів би хороший автономні креслення інструменту , як plot.ly .


3
Я не так добре розбираюся з такими речами, тож я не можу написати гарну відповідь, але ви можете поглянути на них ipywidgets(приклади на github.com/ipython/ipywidgets/blob/master/docs/source/examples /… ) Або bokeh( bokeh.pydata.org/en/latest ).
Torbjørn T.

Відповіді:


10

Існує дивовижна бібліотека під назвою MPLD3, яка генерує інтерактивні графіки D3.

Цей код створює HTML-інтерактивний графік популярного набору ірисів, сумісний із Jupyter Notebook. Коли вибрано пензлик, він дозволяє вибрати підмножину даних, які слід виділити серед усіх ділянок. Коли вибрана перехресна стрілка, вона дозволяє переходити на точку даних мишкою та бачити інформацію про вихідні дані. Ця функціональність є дуже корисною при аналітичному аналізі даних.

імпортувати matplotlib.pyplot як plt
імпортувати numpy як np
імпортувати панди як pd
імпортувати мертвих як sb
імпортувати mpld3
з імпортних плагінів mpld3
% matplotlib inline

iris = sb.load_dataset ('iris')
від sklearn.preprocessing import StandardScaler
X = pd.get_dummies (ірис)
X_scal = StandardScaler (). Fit_transform (X)

дим = 3
з sklearn.decomposition імпорту PCA
pca = PCA (n_components = dim)
Y_sklearn = pca.fit_transform (X_scal)

# Визначте деякі CSS, щоб контролювати наші власні мітки
css = "" "
стіл
{
  кордон-колапс: колапс;
}
го
{
  колір: #ffffff;
  фоновий колір: # 000000;
}
тд
{
  колір фону: #cccccc;
}
стіл, -ю, тд
{
  сімейство шрифтів: Arial, Helvetica, sans-serif;
  облямівка: 1px суцільна чорна;
  вирівнювання тексту: справа;
}
"" "

fig, ax = plt.subplots (тьмяний, тьмяний, figsize = (6,6))
fig.subplots_adjust (hspace = .4, wspace = .4)
підказка = [немає] * тьмяно

N = 200
index = np.random.choice (діапазон (Y_sklearn.shape [0]), розмір = N)

для м в діапазоні (дим):
    для n в діапазоні (m + 1):
        ax [m, n] .grid (Правда, альфа = 0,3)
        розсип = сокира [м, п]. розсіювання (Y_sklearn [індекс, m], Y_sklearn [індекс, n], альфа = .05)

        мітки = []
        для i в індексі:
            label = X.ix [[i],:]. T.astype (int)
            label.columns = ['Рядок {0}'. формат (X.index [i])]
            labels.append (str (label.to_html ()))

        ax [m, n] .set_xlabel ("Компонент" + str (m))
        ax [m, n] .set_ylabel ("Компонент" + str (n))
        #ax [m, n] .set_title ('HTML підказки', розмір = 20)

        tooltip [m] = плагіни.PointHTMLTooltip (розсип, мітки,
                                           voffset = 20, hoffset = 20, css = css)
        plugins.connect (інжир, підказка [m])

plugins.connect (fig, plugins.LinkedBrush (розкидання))
test = mpld3.fig_to_html (fig = fig)

з відкритими ("Output.html", "w") як text_file:
    text_file.write (тест)

Побачити це в дії на моєму блозі .

Оновлення [9 липня 2016 року]: Я щойно з’ясував, що Plot.ly має офлайн-режим і тепер відкритий код. У ньому багато упакованих дзвіночків, але MPLD3 в деяких випадках все-таки може бути доречним.


3

Я вважаю за краще, щоб це був коментар, а не відповідь, оскільки мій намір не підключати / рекламувати, але я зараз працюю над своєю тезою, яка може зацікавити вас, оскільки вона робить те, що ви хочете. Насправді це інструмент візуалізації кластеризації, але якщо ви використовуєте k-засоби з k = 1, у вас є інтерактивний графік, де ви можете шукати терміни, вибирати область та бачити вміст кожного вузла та інші речі. Погляньте і подивіться, чи працює він для вас!

https://github.com/Lilykos/clusterix


Класно! Я буду дивитись.
scottlittle

0

Дуже вдалий вибір, сюжетно ...

У моєму випадку я намагався побудувати подібне позначення на основі навичок, де навички - це слово2vec, вбудоване в 300 вимірів; вивів його у 3-х мірний векторний простір і, використовуючи сюжетно Scatter3D, я зміг побудувати 3D-розсіювач для того ж.

Et Viola !! Отримав дивовижний тривимірний графік із наведенням курсора та збільшенням. І найкраще, що він може бути експортований як HTML-файл, що робить його підключенням та програванням, підходящим для будь-якого іншого ПК, просто перетягніть браузер (включений у код нижче).

Чи можна щось БЕЖЕ простіше

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
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.