2016-04-14 27 views
0

私はIsomapアルゴリズムの結果を表現したいと思います。しかし、私はまた、ユーザーが彼が保持したいコンポーネントの数を選択したい。 私はそのためにスライダオブジェクトを作成しますが、コールバック関数がJavascriptであることです。したがって、scikitを使ってデータを更新することはできません。 これは私のコードです、誰かがいくつかのアイデアを与えることができますか? は、一度に全体.data辞書を更新するために、常により良いです、あなたは動的視覚化ボケ

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

*ユーザーインタラクションから* python *コードをトリガーしたい場合は、Bokehサーバーアプリケーションを作成する必要があります。ご存じのように、 'CustomJS'コールバックはPythonではなくJavaScriptのみを実行できます。いくつかの例がここにあります:https://github.com/bokeh/bokeh/tree/master/examples/app(画像をクリックすると、アプリの実行中のバージョンに移動します)と、ここにたくさんのドキュメントがあります:http://bokeh.pydata.org/en/latest/docs/user_guide/server.html – bigreddot

+0

リンクありがとうございました。 それは私の問題を解決するのを助けた –

答えて

0

まずありがとうございます。だから、はこの行いません。代わりに、最初のデータとnewdictを作る

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

を、その向こう

source2.data = newdata 

を行い、それが言うのは難しいです。各更新プログラムで〜1000 x-yポイントを送信しているようですか?それは不合理な数字ではなく、多くの例がそれを示しています。計算そのものがかなりの時間を取っていないことは確かですか?どのくらいか:

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

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

は自分自身で、終えるために取りますか?

私の推測では、それらは単純に計算に多少の時間がかかります。そうであれば、ボケができることは何もありません。 0.12では、プロトコルに「ビジー」メッセージが追加されるはずです。そのため、高価な計算が行われていることを視覚的に示すことができます。

+0

私はMDSの計算時間をチェックし、すべての私の問題がそれから来たことに気づいた。 (Webページを生成するのに36秒必要とし、MDSは34秒必要でした) 助けてくれてありがとう –

+0

素晴らしい!私が言及したように、「0.12」には、物事が「忙しい」時にユーザーを表示するのに役立ついくつかの新しい視覚的指標が必要です – bigreddot