0

私はグラフについて学んでおり (非常に便利そうです)、グラフを構築する方法についてアドバイスが得られるかどうか疑問に思っていました。

簡単に言えば、毎日注文データを取得し、前日と同じ日もあれば、異なる日もあるとしましょう。たとえば、昨日は鉛筆と消しゴムの注文があり、それらを表す 2 つのノードを作成し、今日は消しゴムとマーカーの注文を受けました。毎日の後、私のプログラムは、誰が何を注文したかを調べます。ボブが昨日鉛筆を注文し、今日消しゴムを注文した場合、有向エッジが作成されます。これに対する私の論理は、誰が毎日何を購入したかを確認でき、ボブの購入行動を追跡できることです (そして、それを使用して、ボブ自身や他のユーザーとのパターンを推測することもできます)。

私の問題は、networkx(python) を使用して、昨日のノード 'pencil' を作成し、次に day2 の別のノード 'pencil' を作成していて、それらを区別できないことです。

私はそれを day2-pencil と命名し、グラフ全体をスキャンして「day2-」を取り除いて鉛筆の注文を追跡することを考えました (実際に行ってきました)。これは私には間違っているようです(プロセッサで高価なことは言うまでもありません)。重要なのは、どうにかして毎日を独自のサブグラフとしてマークできるかどうかだと思います。そのため、特定の日または数日を調査したい場合、グラフ全体をスキャンする必要はありません。

テストデータが大きくなるにつれて、ますます混乱するので、ベストプラクティスは何ですか? 提案を生成するのは素晴らしいことです(networkxはかなりフル機能のように見えるので、おそらくそれを行う方法があります)。

前もって感謝します!

更新:まだうまくいきませんが、これは役立つかもしれません:

import networkx as nx
G=nx.Graph()
G.add_node('pencil', day='1/1/12', colour='blue')
G.add_node('eraser', day='1/1/12', colour='rubberish colour. I know thats not a real colour')
G.add_node('pencil', day='1/2/12', colour='blue')

次のコマンドを入力した結果は次のとおりG.nodeです。

{'pencil': {'colour': 'blue', 'day': '1/2/12'}, 'eraser': {'colour': 'rubberish colour. I know thats not a real colour', 'day': '1/1/12'}}

1/1/12 の鉛筆を 1/2/12 の鉛筆で明らかに上書きしていますが、別の鉛筆を作成できるかどうかはわかりません。

4

3 に答える 3

3

これは主に実際の目標によって異なります。分析したいのは、グラフ設計の決定的な要因です。しかし、構造を見ると、一般的な構造はとのノードでCustomersありProducts、によって接続されてDaysいます(これがさらに役立つかどうかはわかりませんが、実際には2部グラフです)。

したがって、構造は次のようになります。

node(Person) --- edge(Day) ---> node(Product)

たとえば、ボブは1/1/12に鉛筆を購入します。

node(Bob) --- 1/1/12 ---> node(Pencil)

さて、ボブは1/2/12に別の鉛筆を買いに行きます。

          -- 1/1/12 --
         /            \
node(Bob)              > node(Pencil)
         \            /
          -- 1/2/12 --

すぐ...

これは実際には。で可能networkxです。ノード間に複数のエッジがあるため、エッジの方向性に応じてMultiGraphMorを選択する必要があります。MultiDiGraph

In : g = networkx.MultiDiGraph()

In : g.add_node("Bob")
In : g.add_node("Alice")

In : g.add_node("Pencil")

In : g.add_edge("Bob","Pencil",key="1/1/12")
In : g.add_edge("Bob","Pencil",key="1/2/12")

In : g.add_edge("Alice","Pencil",key="1/3/12")
In : g.add_edge("Alice","Pencil",key="1/2/12")

In : g.edges(keys=True)
Out:
[('Bob', 'Pencil', '1/2/12'),
 ('Bob', 'Pencil', '1/1/12'),
 ('Alice', 'Pencil', '1/3/12'),
 ('Alice', 'Pencil', '1/2/12')]

これまでのところ、悪くはありません。「アリスは1/1/12に鉛筆を購入しましたか?」などのクエリを実際に実行できます。

In : g.has_edge("Alice","Pencil","1/1/12")
Out: False

In : g.has_edge("Alice","Pencil","1/2/12")
Out: True

特定の日にすべての注文が必要な場合は、状況が悪化する可能性があります。悪いことに、私はコードに関してではなく、計算に関して意味します。コード的にはかなり単純です。

In : [(from_node, to_node) for from_node, to_node, key in g.edges(keys=True) if key=="1/2/12"]
Out: [('Bob', 'Pencil'), ('Alice', 'Pencil')]

ただし、これはネットワーク内のすべてのエッジをスキャンし、必要なエッジをフィルタリングします。これ以上の方法はないと思いますnetworkx

于 2012-01-12T04:46:46.857 に答える
0

グラフはこれに最適な方法ではありません。MySQL などのリレーショナル データベースは、このデータを格納し、誰がいつ何を購入したかなどのクエリを実行するための適切なツールです。

于 2012-01-14T19:05:40.983 に答える
0

これを試して:

各ノードに一意の整数 ID を付与します。次に、次のようなディクショナリ ノードを作成します。

nodes['pencil'] = [1,4,...] <- これらはすべて、pencil 属性を持つノードに対応します。「鉛筆」を、関心のある他の属性に置き換えます。

「鉛筆」でノードを追加するときは、辞書を更新するようにしてください。

node['pencil'].append(new_node_id)。ノードの削除も同様です。

于 2012-04-10T17:25:07.867 に答える