論文メモ - Matrix- and tensor-based recommender systems for the discovery of currently unknown inorganic compounds
https://arxiv.org/pdf/1710.00659.pdf
(2017年9月)
(以下自分の解釈メモ)
概要
機械学習を用いて、未発見のChemically relevant components (CRCs)の候補を、非負値行列因子分解(NMF)・特異値分解(SVD)・CP分解・Thucker分解をベースとしたレコメンドシステムで探索する論文。
候補CRCに対して、密度汎関数理論(DFT)を用いて安定性の評価を行っている。
背景
膨大な元素の組み合わせの物質を網羅的にDFTで計算するのは計算コストがかかる。
⇒ 既存データから機械学習で候補を見つけられればコスト削減
データセット
- ICSD
- Powder Difraction File (PDF)
- SpringerMaterials(SpMat)
上記3つのデータベースから無機結晶構造のデータを使用。
$A_aB_bX_x$の三元化合物を対象。 (A、Bは陽イオン(66個)。Xは陰イオン(10個))
$max(a,b,x)≤8$
全組み合わせとしては$662×10×170=7,405,200$個の化合物
3元化合物に加え、4元・5元も作成。
Matrix-basedレコメンドシステム
- {$A$} and {$B, X, (a,b,x)$}
- {$A, X$} and {$B, (a, b, x)$}
- {$A, B$} and {$X, (a, b, x)$}
現在発見されている化合物の箇所だけ1、未発見/存在しない化合物の箇所は0で埋める。
(FIG.3参照)
NMF、SVDで評価。
(FIG.4参照)
Tensor-basedレコメンドシステム
{$A$}、{$B$}、{$a,b,x$}を評価テンソルの三軸に対応させる。
(FIG.5参照)
CP分解・Thucker分解で評価。
(FIG.6参照)
評価
高評価順ならべたトップ27に対しDFTで安定性評価。
⇒ ほとんど(85%)が安定
トップ27と元素の組み合わせ{$A,B,X$}は同じだが、{$a,b,x$}が異なる低評価化合物に対してもDFTで安定性評価。
⇒ ほとんど(86%)が不安定
(TABLE Ⅲ参照)
Conclusion
Thucker分解が一番良い発見率。
量子アニーリングシミュレーション (苦戦中)
Web情報を参考に量子アニーリングを実装して検証を行ってみたが、うまくいかない・・・
ソース
ベースクラス
import numpy as np import matplotlib.pyplot as plt class System(): def __init__(self, temperature, kb=1): self._temperature = temperature self._kb = kb # 温度の設定 def set_temperature(self, temperature): self._temperature = temperature # 温度の取得 def get_temperature(self): return self._temperature
シミュレーティッドアニーリングクラス
class SpinSystem(System): def __init__(self, spin_num_col, spin_num_row, interactions, kb=1, temperature=30): super().__init__(temperature, kb) self._spin_num_col = spin_num_col self._spin_num_row = spin_num_row self._interactions = interactions self._spin_map = self._create_spinmap(spin_num_row, spin_num_col) # 温度の設定 def set_temperature(self, temperature): self._temperature = temperature # 温度の取得 def get_temperature(self): return self._temperature # [i, j]のスピンを更新 def _update_spin(self, i, j): # スピンが↑を向く確率 up_prob = np.exp(-self._calc_spin_energy(i, j, 0)/(self._kb*self._temperature)) / \ (np.exp(-self._calc_spin_energy(i, j, 0)/(self._kb*self._temperature)) + \ np.exp(-self._calc_spin_energy(i, j, np.pi)/(self._kb*self._temperature))) rand = np.random.rand() if up_prob > rand: self._spin_map[i][j] = 0 # ↑向き else: self._spin_map[i][j] = 1 # ↓向き # スピンをランダムにnum_spin個更新 def update_spins(self, num_spin): for i, j in zip(np.random.randint(0, self._spin_num_row, num_spin), np.random.randint(0, self._spin_num_col, num_spin)): self._update_spin(i, j) # [i, j]のスピンがphi方向向いているときのエネルギーを計算 def _calc_spin_energy(self, i, j, phi): energy = 0 try: energy += -self._interactions[i*j][(i-1)*j] * np.cos(phi - np.pi*self._spin_map[i-1][j]) except IndexError as e: pass try: energy += -self._interactions[i*j][(i+1)*j] * np.cos(phi - np.pi*self._spin_map[i+1][j]) except IndexError as e: pass try: energy += -self._interactions[i*j][i*(j+1)] * np.cos(phi - np.pi*self._spin_map[i][j+1]) except IndexError as e: pass try: energy += -self._interactions[i*j][i*(j-1)] * np.cos(phi - np.pi*self._spin_map[i][j-1]) except IndexError as e: pass return 0.5 * energy # 全エネルギーを計算する def calc_system_energy(self): energy = 0 for i in range(self._spin_num_row): for j in range(self._spin_num_col): energy += self._calc_spin_energy(i, j, np.pi if self._spin_map[i][j] == 1 else 0) return energy # spin_num_row × spin_num_colのスピンマップを作成 def _create_spinmap(self, spin_num_row, spin_num_col): spin_map = np.zeros([spin_num_row, spin_num_col]) for i in range(spin_num_row): for j in range(spin_num_col): spin_map[i][j] = 0 if np.random.rand() <= 0.5 else 1 return spin_map # スピンマップを初期化する def initialize_spins(self): self._spin_map = self._create_spinmap(spin_num_row, spin_num_col) def get_spinmap(self): return self._spin_map
量子アニーリングクラス
class QuantumSpinSystem(System): def __init__(self, spin_num_col, spin_num_row, spin_systems, temperature, interactions, kb=1, transverse_field=10): super().__init__(temperature, kb) self._spin_num_col = spin_num_col self._spin_num_row = spin_num_row self._spin_systems = spin_systems self._transverse_field = transverse_field self._interactions = interactions def set_temperature(self, temperature): self._temperature = temperature for spin_system in self._spin_systems: spin_system.set_temperature(temperature) # 横磁場を設定 def set_transverse_field(self, transverse_field): self._transverse_field = transverse_field # 横磁場による相互作用の係数を計算 def _transverse_field_interaction(self): return 0.5 * self._kb * self._temperature * np.log(1/np.tanh(self._transverse_field / (self._kb * self._temperature * len(self._spin_systems)))) # [i, j, k]のスピンを更新 def _update_spin(self, i, j, k): # スピンが↑を向く確率 up_prob = np.exp(-self._calc_spin_energy(i, j, k, 0)/(self._kb*self._temperature)) / \ (np.exp(-self._calc_spin_energy(i, j, k, 0)/(self._kb*self._temperature)) + \ np.exp(-self._calc_spin_energy(i, j, k, np.pi)/(self._kb*self._temperature))) rand = np.random.rand() if up_prob > rand: self._spin_systems[k].get_spinmap()[i][j] = 0 # ↑向き else: self._spin_systems[k].get_spinmap()[i][j] = 1 # ↓向き # スピンをランダムにnum_spin個更新 def update_spins(self, num_spin): for i, j, k in zip(np.random.randint(0, self._spin_num_row, num_spin), np.random.randint(0, self._spin_num_col, num_spin), np.random.randint(0, len(self._spin_systems), num_spin)): self._update_spin(i, j, k) # [i, j, k]のスピンがphi方向向いているときのエネルギーを計算 def _calc_spin_energy(self, i, j, k, phi): energy = 0 # ij(スピンマップ)面方向の交換相互作用によるエネルギー計算 try: energy += -self._interactions[i*j][(i-1)*j] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i-1][j]) except IndexError as e: pass try: energy += -self._interactions[i*j][(i+1)*j] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i+1][j]) except IndexError as e: pass try: energy += -self._interactions[i*j][i*(j+1)] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i][j+1]) except IndexError as e: pass try: energy += -self._interactions[i*j][i*(j-1)] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i][j-1]) except IndexError as e: pass energy *= 0.5 # k方向の相互作用(横磁場)によるエネルギー計算 s1 = 1 if self._spin_systems[k].get_spinmap()[i][j] == 0 else -1 #min_k = np.argmin(self.get_system_energies()) try: s2 = 1 if self._spin_systems[k-1].get_spinmap()[i][j] == 0 else -1 energy += -self._transverse_field_interaction() * s1 * s2 except IndexError as e: pass try: s2 = 1 if self._spin_systems[k+1].get_spinmap()[i][j] == 0 else -1 energy += -self._transverse_field_interaction() * s1 * s2 except IndexError as e: pass return energy # 各スピンマップ(トロッタ?)のエネルギーを配列で返す def get_system_energies(self): return [spin_system.calc_system_energy() for spin_system in self._spin_systems]
検証
# 100x100個のスピンマップ SPIN_COL_NUM = 100 SPIN_ROW_NUM = 100 INTERACTIONS = np.random.randn( SPIN_COL_NUM * SPIN_ROW_NUM, SPIN_COL_NUM * SPIN_ROW_NUM ) if __name__ == '__main__': temperature = 1000 # 初期温度 spin_system = SpinSystem( spin_num_col=SPIN_COL_NUM, spin_num_row=SPIN_ROW_NUM, interactions=INTERACTIONS, temperature=temperature ) trotta_num = 10 # トロッタ数 quantum_spin_system = QuantumSpinSystem( spin_num_col=SPIN_COL_NUM, spin_num_row=SPIN_ROW_NUM, temperature=temperature, interactions=INTERACTIONS, spin_systems=[SpinSystem( spin_num_col=SPIN_COL_NUM, spin_num_row=SPIN_ROW_NUM, interactions=INTERACTIONS, temperature=temperature ) for i in range(trotta_num)] ) temperature_hist = [] step_hist = [] energy_hist = [] energy2_hist = [[] for i in range(trotta_num)] update_num = 10 step = 0 delta_t = 1 # 10Kまでdelta_t刻みで温度下げる while temperature > 10: # シミュレーテッドアニーリング系の温度を設定 spin_system.set_temperature(temperature) # 量子アニーリング系の温度を設定 quantum_spin_system.set_temperature(temperature) # 横磁場を設定。(温度の1000分の1とした) quantum_spin_system.set_transverse_field(temperature/1000) temperature -= delta_t # シミュレーテッドアニーリング系のスピンをupdate_num個更新 spin_system.update_spins(num_spin=update_num) # 量子アニーリング系のスピンをupdate_num個更新 quantum_spin_system.update_spins(num_spin=update_num) step += update_num energy = spin_system.calc_system_energy() temperature_hist.append(temperature) step_hist.append(step) energy_hist.append(energy) energy2 = quantum_spin_system.get_system_energies() for i, ener in enumerate(energy2): energy2_hist[i].append(ener) print('{}K : {}'.format(temperature, energy)) print('quantum energy : ', energy2) print('average quantum energy : ', sum(energy2)/len(energy2)) print(' ') plt.plot(step_hist, energy_hist, linestyle='dashed') for energy in energy2_hist: plt.plot(step_hist, energy) plt.show()
やってることは
100x100個のスピンマップを作成。スピンの向きはランダムに初期化。イジングモデルなので↑、↓二方向のみ。
シミュレーティットアニーリングと量子アニーリング系で使用するスピンi、j間の交換相互作用を正規分布でランダムに初期化。効果検証のため両系で同じ交換相互作用を用いている。
量子アニーリング系は内部的にトロッタ数(今回は10とした)のシミュレーティットアニーリング系(のインスタンス)を保持し、(隣接の)各シミュレーティットアニーリング系は横磁場を通じて相互作用している。
シミュレーティドアニーリング系と量子アニーリング系を同時に走らせて、1000K⇒10Kへ1K刻みで降温。降温に伴いに横磁場も1⇒0程度になるように変化させている。
エネルギー推移をみることで効果の検証。
↑は横軸が系の全更新数、縦軸が各スピンマップのエネルギー。 破線がシミュレーティッドアニーリング。
量子アニーリング系のエネルギーがシミュレーティッドアニーリング系のエネルギーより減少 していくことを期待したが、まったく減少しない・・●rz
横磁場と聞いていたので、スピンマップに対して垂直方向にスピン向ける効果があるとイメージしていたが、どちらかというと複数のスピンマップをトロッタ数分重ねていき3次元のスピン系を作成し、スピンマップ面方向の交換相互作用は時間・温度に非依存、重ねていった軸(スピンマップ垂直)方向の交換相互作用の大きさが横磁場の大きさ(時間)や温度に依存して変化する系のスピン変化をシミュレートしている感じがした。
金融 - 計量分析勉強メモ1
株価の収益率
t+Δt時点での株価をS(t+Δt)とすると、収益率Rは
コールオプション
権利行使価格をEとすると、コールオプション価格をCとするとΔt後の利益は
S(t+Δt)-E>Cの場合得、S(t+Δt)-E<Cの場合損
確率微分方程式
t~t+Δtでの収益率は
uΔt:瞬間的な収益率
Δt⇒0で
W(t):標準ブラウン運動
σ=0の場合、無リスク証券の価格変動
連続複利収益率
ブラウン運動
算術ブラウン運動
方程式解:
幾何ブラウン運動
方程式解:
O-U(オルンシュタイン-ユーレンベック)過程
方程式解:
X(0)=xのときX(t)は
に従う。
t=0⇒∞で(中心,分散)が(x,0)⇒(μ,σ2/(2κ))
平方根過程
参考
ファイナンスへの計量分析
香港メモ①
通信手段
Amazon | 【中国移動香港】4G/3G 中国TDD・香港FDD10日間1.5GBデータプリペイドSIM [並行輸入品] | SIMカード 通販
回線形式で対応機種が異なるので確認必要
充電
200/220V 50Hz 変圧器が必要
交通手段
空港から市内
・MTR
・エアポートエクスプレス
約6:00~24:00まで12分おきに運航
九龍までHK$90
オクトパスカード利用可
オクトパスカード
MTR、地下鉄、電車、シティバス、フェリーで共通で使える便利カード
・買い方
・チャージ
空港
成田空港
チェックイン(48時間まえからWebチェックイン可⇒バーコードかざす必要あり?)⇒荷物検査⇒セキュリティチェック⇒税関申告(100万以上の現金等持ち出す場合のみ)⇒出国審査⇒搭乗ゲート
・バニラエア
第3ターミナル
23×56×36cm 10kgまで持ち込み可
香港国際空港
出発の1時間半~2時間前には到着しておいたほうがいい
お金
クレジットカード海外キャッシング
現地で現金両替
空港
銀行
ホテル⇒手数料高い、レート悪い
自動両替機⇒24時間可
Wi-Fi
GovWiFi
公共無料WiFi
SSID :「freegovwifi」「freegovwifi-e」
MTR
香港国際空港
時差
1時間
為替レート
1HKD = 14.1529607 円(2017/08/06)
仮想通貨銘柄メモ①
1. カイカ
概要
【特色】中国留学生創業のSIだが中国事業撤退。フィスコ系ネクス傘下で経営再建進捗。旧SJI
株価
企業情報
設立:1989年7月14日(商号変更 2017年2月1日)
事業内容:情報サービス事業
資本金:7,775,162千円(2017年6月30日現在)
社員数:463名(2017年4月30日現在 連結)
市場:東京証券取引所JASDAQ(スタンダード)
IR
ニュース
ウェブトラベルがフィスコ仮想通貨取引所でビットコイン決済を開始
まぐまぐニュース!-2017/07/03
【経済】CAICAコインの追加発行をロック、フィスコ仮想通貨取引所でも取扱開始 2017年07月18日11時36分
リネットジャパン—カイカと共同でASEANにて仮想通貨、ブロックチェーン活用ファイナンスサービスの実証実験 2017/06/05
メモ
・フィンテック戦略室
今、その変化の要因となる新しいテクノロジーが登場しています。 当社は、その中でも特に重要な変化要因として「人工知能」と「ブロックチェーン」に注目しています。 これらの技術は既存の金融インフラを刷新するほどの可能性を秘めています。
・先端技術研究所
現在、当社のフィンテック戦略に即したブロックチェーン、クラウドコンピューティング、ビッグデータ、人工知能などの技術に関する調査・研究に取り組むと同時に、新たな環境・手法・プラットフォーム、オープンソースなどの開発技術においても調査・研究を行っております。
2. セレス
概要
【特色】『モッピー』『モバトク』などスマホ向けポイントサイトを運営。求人メディアも。広告収入が柱
株式会社セレスは、ポイントサイトの運営を行う企業である。『インターネットマーケティングを通じて豊かな世界を実現する』を経営理念に掲げ、パソコン、スマートフォン、フィーチャー・フォン上で複数のインターネットメディアサービスを展開する企業。
株価
企業情報
設立年月日:2005年1月28日
市場名:東証1部
上場年月日:2014年10月22日
決算:12月末日
単元株数:100株
従業員数:
(単独) 67人 従業員数
(連結) -人
平均年齢:31.5歳
平均年収:4,540千円
事業内容
沿革
IR
ニュース
仮想通貨取引所のビットバンクがポイントサイトのセレスから8.5億円を調達、スマホ向けサービスで協業 2017年7月12日
セレス—大幅続伸、ビットコイン海外送金サービス「Sobit」の開始で 2017年5月22日
株式会社セレス、IndieSquare と提携 仮想通貨を渋谷・新宿駅周辺で獲得できる「モッピーGO」の提供開始 2017.2.10
3. フィスコ
概要
金融関連情報をネットで提供。M&Aで事業多角化、企業調査やコンサル、ネット旅行業も育成
株式会社フィスコは、日本の独立系金融情報配信会社である。ブルームバーグやトムソン・ロイターに代表される金融情報端末やヤフーなどのポータル・サイトに情報提供を行うほか、個人投資家向け会員制投資情報クラブやモバイルなどの情報配信ネットワークを通じてリアルタイムで投資情報を提供している。
株価
企業情報
設立年月日:1995年5月15日
市場名:東証JASDAQグロース
上場年月日:2006年6月8日
決算:12月末日
単元株数:100株
従業員数:
(単独) 27人 従業員数
(連結) 939人
平均年齢:44.2歳
平均年収:5,530千円
事業内容
IR
ニュース
TDSEとフィスコによるFinTech戦略 人工知能エンジンScorobo@ for Fintech第一弾株価予測AI評価と今後の展開 2017年4月17日
論文役メモ ~ 自然言語処理 ~ Language Modeling with Gated Convolutional Networks ~ Abstract
Language Modeling with Gated Convolutional Networks
https://arxiv.org/pdf/1612.08083.pdf
Facebook AI ResearchによるCNNを利用した自然言語処理に関する論文
訳メモ
Abstract
The pre-dominant approach to language modeling to date is based on recurrent neural networks. Their success on this task is often linked to their ability to capture unbounded context. In this paper we develop a finite context approach through stacked convolutions, which can be more efficient since they allow parallelization over sequential tokens. We propose a novel simplified gating mechanism that outperforms Oord et al. (2016b) and investigate the impact of key architectural decisions. The proposed approach achieves state-of-the-art on the WikiText- 103 benchmark, even though it features longterm dependencies, as well as competitive results on the Google Billion Words benchmark. Our model reduces the latency to score a sentence by an order of magnitude compared to a recurrent baseline. To our knowledge, this is the first time a non-recurrent approach is competitive with strong recurrent models on these large scale language tasks.
これまでの言語モデルへの大半のアプローチはRNNをベースとしていた。 RNNによる言語モデリングの成功は、RNNがunbounded contextをとらえる能力をもっていることに繋がっていた。 本論文では、シーケンシャルなトークンに対して並列処理が可能で、より効率的である多層畳み込みを使用した有限コンテキストアプローチを構築する。 Oord et al. (2016b)を超える単純化したゲートメカニズムを提案し、重要な構造決定の影響を調べる。 提案するアプローチは長期依存性をもっているが、WikiText-103ベンチマークに関して最先端を実現する。 Google Billion Words benchmarkに対しても競り合える結果を出す。 我々のモデルは、リカレントベースラインと比較して、文のスコアリングの遅延を削減する。 我々の知る限りでは、これらの巨大スケールの言語タスクに対してRNN以外のアプローチが、強力なRNNに匹敵する結果をだすのは初めてである。