2016-04-14 15 views
0

Bir Isomap algoritmasının sonucunu temsil etmek istiyorum. Ama aynı zamanda kullanıcının saklamak istediği bileşen sayısını seçmesini de istiyorum. Bunun için bir kaydırıcı nesne oluşturuyorum ancak buradaki geriçağırım işlevi Javascript'tedir. Bu nedenle, verilerimi güncellemek için scikit öğrenmelerini kullanamıyorum. Bu benim kodum, birileri fikir verebilir mi? aynı anda tüm .data dicti güncellemek için her zaman daha iyidir, senDinamik görselleştirme bokeh

import numpy as np 
from bokeh.io import vform 
from bokeh.models import CustomJS, ColumnDataSource 
from bokeh.plotting import figure, output_file, show 
from bokeh.models.widgets import Slider 
from sklearn import manifold 

output_file("test.html") 


X = np.random.randn(1000,20) 

Y = np.random.randn(1000,20) 

X_isomap = manifold.Isomap(n_neighbors=10, n_components=2).fit_transform(X) 

X1 = X_isomap[:,0] 
X2 = X_isomap[:,1] 

IsoSource = ColumnDataSource(data=dict(x=X1, y=X2,DATA=X)) 

plot1 = figure(plot_width=400, plot_height=400,tools = "pan,wheel_zoom,box_zoom,reset,resize") 
plot1.circle('x', 'y',source=IsoSource,size=7, color="navy") 


#sliderCompMDS = Slider(title="n_components MDS",value=2,start=2,end=20,step=1) 


callback = CustomJS(args=dict(source=IsoSource),code=""" 
    var data = source.get('data'); 
    var f = cb_obj.get('value') 
    x = data['x'] 
    y =data['y'] 
    X = data['DATA'] 
    donnees = manifold.Isomap(n_neighbors=10, n_components=f).fit_transform(X) 
    x = donnees[:,0] 
    y = donnees[:,1] 
    source.trigger('change'); 

    """) 

sliderCompIso = Slider(title="n_components Isomap",value=2,start=1,end=20,step=1,callback=callback) 



layout = vform(sliderCompIso, plot1) 

show(layout) 
+0

Kullanıcı etkileşimlerinden * python * kodunu tetiklemek isterseniz, bir Bokeh sunucusu uygulaması oluşturmanız gerekir. Sizin de belirttiğiniz gibi, 'CustomJS' geri çağrıları sadece python değil, JavaScript'i çalıştırabilir. Burada birkaç örnek görebilirsiniz: https://github.com/bokeh/bokeh/tree/master/examples/app (uygulamanın canlı çalışan versiyonuna gitmek için bir resme tıklayın) ve burada çok sayıda doküman bulabilirsiniz. : http://bokeh.pydata.org/en/latest/docs/user_guide/server.html – bigreddot

+0

Bağlantılarınız için çok teşekkürler. Sorunumu çözmeme yardımcı oldu –

cevap

0

İlk ederiz. Yani, bunu yapın:

source2.data['y1'] = Y_MDS[:,0] 
source2.data['y2'] = Y_MDS[:,1] 

yerine ilk verilerle bir newdict olun, ardından Bunun ötesinde

source2.data = newdata 

yapmak, söylemek zor. Her güncellemede ~ 1000 x-y puan gönderiyorsunuz gibi görünüyor? Bu mantıksız bir sayı değil ve birçok örnek bundan daha fazlasını gösteriyor. Hesaplamanın kendisinin kayda değer bir zaman ayırmadığından emin misiniz? Ne zamandır yapın:

manifold.Isomap(n_components=w).fit_transform(X) 

ve

manifold.MDS(n_components=u).fit_transform(Y) 

almak kendi başlarına, bitirmek için?

Tahminimce, bunların hesaplanması biraz zaman alıyor. Eğer durum buysa, Bokeh'in yapabileceği bir şey yok. 0.12'da, protokole "meşgul" mesajı eklenmelidir, böylece uygulama, bu pahalı hesaplamanın görsel olarak olduğunu gösterebilir.

+0

MDS'nin hesaplama süresini kontrol ettim ve tüm sorunlarımın bundan kaynaklandığını fark ettim. (Web sayfasını oluşturmak için 36 saniyeye ve gerekli MDS'ye ihtiyacım vardı 34 saniye) Yardımlarınız için teşekkürler –

+0

Harika! Daha önce de belirttiğim gibi, "0.12", kullanıcıların "meşgul" olduğu zamanlarda kullanıcılara gösterilmesinde yardımcı olacak bazı yeni görsel göstergelere sahip olmalıdır. – bigreddot