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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Q&A

解決済

1回答

2186閲覧

自己組織化マップの学習アルゴリズムについて

rainof5

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

0グッド

2クリップ

投稿2018/01/03 00:53

###前提・実現したいこと
自己組織化マップによってTSPの近似解を求めたいです。
しかし、自分が実装した近傍関数はどこか違うのではないかと思ってます。
したがって、解決方法を具体的に教えて欲しいです。

###発生している問題・エラーメッセージ
学習で使用する近傍関数が0に常になり、正しく実装されていないのではないかと思っている。

###該当のソースコード

import numpy as np import matplotlib.pyplot as plt import random import math def ranX(cityXMax): #x座標の乱数 return random.randint(0,cityXMax) def ranY(cityYMax): y座標の乱数 return random.randint(0,cityYMax) def distance(a,b): #距離 d = ((a[0]-b[0])**2 + (a[1]-b[1])**2) d = math.sqrt(d) return d def neighborhoodFunction(dis,ln,nln): #近傍関数 lr = 0.8 alpha = 1.0 - (float(nln)/ln) a = -(dis/alpha)**2 h = lr * alpha * math.exp(a) return h class neuron: #ニューロン(ノード) def __init__(self,n,cityXMax,cityYMax): rv = np.array([]) rv = np.append(rv, [ranX(cityXMax),ranY(cityYMax)]) self.rv = rv #参照ベクトル class SOM: def __init__(self,cv,neurons,ln): self.neurons = neurons self.cv = cv self.ln = ln self.nln = 1 def getWinner(self,neurons,inputData,N): #勝ちニューロンを返す result = np.array([]) tmp = None for i in range(0,N): d = distance(neurons[i].rv,inputData) result = np.append(result,d) for i in range(0,N): if tmp == None: tmp = result[i] min = i if tmp > result[i]: tmp = result[i] min = i return neurons[min] def learning(self,winner,neurons,N): #学習 random_index = np.arange(N) np.random.shuffle(random_index) dis = distance(winner.rv,neurons[random_index[self.ln % N]].rv) h = neighborhoodFunction(dis,self.ln,self.nln) print(h) self.nln += 1 def main(): cv = np.array([[25,40],[36,70],[100,26],[20,210],[20,21]]) #特徴ベクトル n = 5 #都市の数 N = 20 #ニューロンの生成数 cityXMax = -1 cityYMax = -1 ln = 50 #予定している学習回数 neurons = np.array([]) for i in range(0, n): if cv[i][0] > cityXMax: cityXMax = cv[i][0] if cv[i][1] > cityYMax: cityYMax = cv[i][1] for i in range(0, N): neurons = np.append(neurons,neuron(n,cityXMax,cityYMax)) som = SOM(cv,neurons,ln) winner = som.getWinner(neurons,cv[0],N) som.learning(winner,neurons,N) if __name__ == "__main__": main()

###試したこと
近傍関数を色々変更してみたが、オーバーフローが起きたりしました。

###補足情報(言語/FW/ツール等のバージョンなど)
言語はPython3です。
プログラムは1回目の学習を行う途中まで書きました。
そこで、動作テストを行った結果、近傍関数がうまく働いていないのではないかと疑問を
持ちました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1a = -(dis/alpha)**2 2h = lr * alpha * math.exp(a)

何を参考にして実装したのかわかりませんが、
普通expの分母に来るのは座標の分散です

投稿2018/01/05 01:19

ozwk

総合スコア13512

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

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

ozwk

2018/01/05 04:05 編集

そっちを参考にするなら、そこに書いてある通り、 h = c * math.exp(a) cは適当な定数です
rainof5

2018/01/13 16:49

すいません。 返信遅れました。 cを変えるのも試しております。 例えば、c=0.8とした場合もほとんど0です。 稀に○×10^-22といった値が表示されます。
ozwk

2018/01/14 00:49

その0.8という値の根拠はなんですか? ニューロンの初期値と与えられるデータから exp(...)の値を概算して、このぐらいの近傍関数の値になってほしいって感じでcを決めてください
rainof5

2018/01/14 06:26

それでは、何度実行してもmath.exp(a)でほとんど0になるんですが、これは正しいという認識でよろしいですか? exp(a)には○×10^-240といった値が表示される場合があり、このことから0になるのはexp(a)の値が小さすぎて0になってるのではないかと思ってましたが、cの適切な値を決めるだけの問題なんでしょうか?
ozwk

2018/01/14 23:40

手計算でaがいくつ程度になるのか見積もって、実際のaと比べて変じゃなかったらそうです。 でもcとかの調整面倒なので https://www1.doshisha.ac.jp/~mjin/R/Chap_30/30.html とかで紹介されている方を使ったほうが楽かと。
rainof5

2018/01/20 10:31 編集

申し訳ないですが、もう1つ質問です。 URL内における近似関数のexpの分母の分散は勝ちニューロンとランダムで選んできたニューロンのx座標の分散とy座標の分散を求めるってことでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問