質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1417閲覧

無向グラフ上でのクラスタリング出力結果をまとめる方法

ha_horse

総合スコア20

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/06/16 16:36

編集2020/06/16 16:38

無向グラフ上でのクラスタリング結果をまとめる方法についてコードの書き方についてご教授いただきたいです。

背景
私は現在、無向グラフ上でのクラスタリングのコードを書いています。
クラスタリングは問題なくできたのですが、その出力結果が上手くまとめられないので、上手い出力方法がないかと思い質問に至りました。

やりたいこと
今の出力結果では、残った枝を愚直に出力しているため
x_01_
x_04_
x_14_
x_23_
となっていますが、これを[x_01_, x_04_ ,x_14_], [x_23_]
のように、クラスタごとにまとめたいです。
ソースコードの最後の #クラスタの出力 の部分だけ変更したいと考えております。

x_01_というのは、ノード0とノード1の間の枝を示しています。

コードの説明
x[i,j]は枝がある時1, ない時0を表す01決定変数です。

現段階での私なりの着想
i,jに

Python

1import pandas as pd 2import numpy as np 3import pulp 4 5#問題定義 6problem = pulp.LpProblem(name="Test", sense=pulp.LpMaximize) 7 8 9#距離行列(一例) 10cc = [ 11 [0, 3, 0, 0, 3], 12 [0, 0, 1, -3, -1], 13 [0, 0, 0, 3, 0], 14 [0, 0, 0, 0, -1], 15 [0, 0, 0, 0, 0] 16 ] 17 18w ={} 19for i in range(len(cc)): 20 for j in range(len(cc)): 21 w[i,j] = cc[i][j] 22 23#xを決定変数として定義 24x = {} 25for i in range(len(cc)) : 26 for j in range(len(cc)): 27 x[i,j] = pulp.LpVariable("x[{0}{1}]".format(i,j), 0, 1, pulp.LpInteger) 28 29 30 31 32#目的関数の宣言 33problem += pulp.lpSum(w[i,j] * (x[i,j] + y[i,j]) for i in range(len(cc)) for j in range(len(cc))), "TotalValue" 34 35#制約式 36for i in range(len(cc)): 37 for j in range(len(cc)): 38 #problem += x[i,j] <= y[i,j] 39 for k in range(len(cc)): 40 problem += x[i,j] + x[j,k] - x[i,k] <= 1 41 problem += x[i,j] + x[i,k] - x[j,k] <= 1 42 problem += x[i,k] + x[j,k] - x[i,j] <= 1 43 44 45#最適解の結果 46status = problem.solve() 47print(pulp.LpStatus[status]) 48 49print(pulp.value(problem.objective), end=" ") 50 51 52 53#クラスタの出力 54for i in range(len(cc)): 55 for j in range(len(cc)): 56 if x[i,j].value() == 1 and i < j: 57 print(x[i,j]) 58
Optimal 16.0 x_01_ x_04_ x_14_ x_23_

イメージ説明
▲グラフクラスタイメージ図
出力結果とこの図のノード番号は1ずれています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

やりたいこととは、残った枝のみからなるグラフを作ったあと、そのconnected componentsに属する枝かどうかで分類した結果を出力したいということだと思いました。
scipyを使うとこんなかんじにできるのではないでしょうか。

python

1from scipy.sparse import csr_matrix 2from scipy.sparse.csgraph import connected_components 3 4 5edges = [(0, 1), (0, 4), (1, 4), (2, 3)] 6data = [1 for i in range(len(edges))] 7row = [e[0] for e in edges] 8col = [e[1] for e in edges] 9 10graph = csr_matrix((data, (row, col)), shape=(5, 5)) 11#print(graph) 12 13n_components, labels = connected_components(csgraph=graph, directed=False, return_labels=True) 14#print(labels) 15 16for n in range(n_components): 17 for e in edges: 18 if labels[e[0]] == n: 19 print(e, end='') 20 print() 21

出力結果:

(0, 1)(0, 4)(1, 4) (2, 3)

投稿2020/06/19 05:18

編集2020/06/19 05:22
mayac

総合スコア23

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ha_horse

2020/06/21 10:02

ご回答ありがとうございます。 こちらの出力結果は、「改行ごとにクラスタがまとまっている」という認識でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問