【文献】
MIRISAEE,Seyed Hamid ,Mining Representative Items and Itemsets with Binary Matrix Factorization and Instance Selection,Pour obnenir le grade de docteur de l'universite de Grenoble(グルノーブル大学博士論文),フランス,Universite Grenoble Alpes,2016年01月12日,pages:9-30,[令和3年6月24日検索], インターネット<URL:https://tel.archives-ouvertes.fr/tel-01254410/document>
(58)【調査した分野】(Int.Cl.,DB名)
前記選択部は、乱数に基づいて前記選択列番号情報を選択するとともに、前記乱数に基づいて前記選択行番号情報を選択することを特徴とする請求項1に記載の行列分解装置。
前記選択部は、前記第1の行列と前記第2の行列の積と、前記分解対象の行列との差に基づいて前記選択列番号情報として選択するとともに、前記第1の行列と前記第2の行列の積と、前記分解対象の行列との差に基づき、前記選択行番号情報として選択することを特徴とする請求項1に記載の行列分解装置。
前記関数生成部は、更新前の前記第1の行列と更新前の前記第2の行列との積における非ゼロ要素の比率が、前記分解対象の行列における非ゼロ要素の比率に近似するように、前記第1の行列の初期値及び前記第2の行列の初期値を設定することを特徴とする請求項1〜6のいずれか1項に記載の行列分解装置。
前記計算部は、前記変化後のエネルギー値が前記更新後のエネルギー値よりも大きい場合、前記温度決定部により決定された前記アニーリングを行う温度を用いて乱数を発生させ、前記乱数が所定の確率値以上である場合に、前記更新後のエネルギー値を前記変化後のエネルギー値、変化後の第1の行列のスピンを含む第1の行列を前記更新後の第1の行列、変化後の第2の行列のスピンを含む第2の行列を前記更新後の第2の行列にそれぞれ更新することを特徴とする請求項1〜7のいずれか1項に記載の行列分解装置。
【発明を実施するための形態】
【0010】
以下に、本願の開示する行列分解装置、行列分解方法及び行列分解プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。また、以下に示す各実施例は、矛盾を起こさない範囲で適宜組み合わせても良い。
【実施例1】
【0011】
本実施例における行列分解装置100は、
図1に示すように、元行列であるm×n行列Vを、例えばシミュレーテッド・アニーリング処理により、m×k行列Wとk×n行列Hとに分解する。
図1は、実施例1における入出力の一例を示す図である。
図1に示すように、本実施例における行列分解装置100は、m×n行列Vと、ランク数kとの入力1000を受け付ける。行列分解装置100は、入力されたm行n列の行列Vを分解し、m行k列の行列W及びk行n列の行列Hの2つの解行列2000を出力する。なお、行列Vは分解対象の行列の一例であり、行列Wは第1の解行列の一例であり、行列Hは第2の解行列の一例である。また、第1の解行列及び第2の解行列を区別せずに表現する場合に、単に「解行列」と表記する場合がある。なお、本実施例における元行列及び解行列は、例えば要素の値がブール代数系を満たす非負行列である。
【0012】
本実施例における行列分解装置100は、行列W及び行列Hを出力するにあたり、仮の値である「スピン」を含む第1の行列及び第2の行列を設定する。なお、以下において、スピンを含む行列を「候補行列」と記載する場合がある。行列分解装置100は、2つの行列の積を算出し、2つの行列の積と元行列である行列Vとの差分を算出する。行列分解装置100は、2つの行列の積と元行列とが一致しない場合、2つの行列に含まれるスピンをそれぞれ変更して、2つの行列の積の算出と、元行列である行列Vとの比較とを繰り返す。つまり、行列分解装置は、解行列の積が元行列と一致しない要素の数に基づいて、行列であるスピンを変化させる試行回数を決定し、各スピンの変化を試行回数繰り返してエネルギー値を判定するので、要素の不一致を抑制できる。
【0013】
次に、本実施例における行列分解装置の一例について、
図2を用いて説明する。
図2は、実施例1における行列分解装置の一例を示す図である。
図2に示すように、本実施例における行列分解装置100は、記憶部120と、制御部130とを有する。なお、本実施例における行列分解装置100は、例えば図示しない通信部を通じて、図示しない端末装置から要求を受け付けて処理を行うサーバコンピュータ等のコンピュータであるが、これに限られない。行列分解装置100は、例えばパーソナルコンピュータ等のスタンドアロン型コンピュータであってもよく、またスマートフォンやタブレット、ノート型コンピュータなどの携帯可能なコンピュータであってもよい。
【0014】
記憶部120は、例えば制御部130が実行するプログラムなどの各種データなどを記憶する。また、記憶部120は、スピン記憶部121を有する。記憶部120は、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリなどの半導体メモリ素子や、HDD(Hard Disk Drive)などの記憶装置に対応する。
【0015】
スピン記憶部121は、スピンに関する情報を記憶する。スピン記憶部121は、例えば2つの候補行列に含まれるスピンを、行列の形式で記憶する。スピン記憶部121に記憶される情報は、後に説明する初期設定部132により設定され、後に説明するスピン変更部134により更新される。
【0016】
次に、制御部130は、行列分解装置100の全体的な処理を司る処理部である。制御部130は、例えば、CPU(Central Processing Unit)やMPU(Micro Processing Unit)等によって、内部の記憶装置に記憶されているプログラムがRAMを作業領域として実行されることにより実現される。また、制御部130は、例えば、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)等の集積回路により実現されるようにしてもよい。
【0017】
制御部130は、入出力部131、初期設定部132、スピン抽出部133、スピン変更部134、温度制御部135、エネルギー算出部136及び判定部137を有する。なお、入出力部131、初期設定部132、スピン抽出部133、スピン変更部134、温度制御部135、エネルギー算出部136及び判定部137は、プロセッサが有する電子回路の一例やプロセッサが実行するプロセスの一例である。
【0018】
入出力部131は、元行列V等の入力を受け付けて、解行列W及びH等を出力する。例えば、入出力部131は、図示しない通信部又は入力装置等を通じて、元行列である行列V及びランク数kの入力を受け付け、初期設定部132に出力する。また、入出力部131は、判定部137から出力される解行列を、図示しない通信部又は入力装置等を通じて出力する。
【0019】
初期設定部132は、行列分解処理を行うための各種情報の設定を行う。初期設定部132は、入出力部131から行列V及びスピン数kの入力を受けると、行列Vの大きさm及びnを特定して、m行k列の行列W及びk行n列の行列Hの要素となるスピンの初期値W0及びH0を設定し、スピン記憶部121に記憶する。また、初期設定部132は、シミュレーテッド・アニーリング処理に用いる温度の初期値T0、及びシミュレーテッド・アニーリング処理を繰り返すイテレーション回数の最大値である総イテレーション回数itermaxを設定する。さらに、初期設定部132は、エネルギー関数Eを生成する。なお、初期設定部132は、関数生成部の一例である。
【0020】
初期設定部132は、行列Wの初期値W0として、例えば全てのスピンを「0」又は「1」に設定する。同様に、初期設定部132は、行列Hの初期値H0として、例えば全てのスピンを「0」又は「1」に設定する。
【0021】
初期設定部132は、例えば温度の初期値T0として、10^9などの絶対温度を設定する。初期設定部132は、イテレーション回数の最大値itermaxとして、例えば100万回〜10億回などの回数を設定する。また、初期設定部132は、例えば以下の式(1)に示すようなエネルギー関数Eを設定する。
【0022】
【数1】
【0023】
なお、式(1)において、「V
ij」は行列Vのi行j列の要素を示し、「°」はブール代数での行列の演算を示す。すなわち、「(W°H)
ij」は、行列Wと行列Hとの行列積のi行j列の要素を示す。
【0024】
ところで、ブール代数系を満たす要素V
ijの演算においては、V
ij^2=V
ijとなる。すなわち、要素を2乗した値が元の要素と等しいため、式(1)は以下の式(2)のように変形することができる。
【0025】
【数2】
【0026】
なお、式(1)及び式(2)は、行列Wと行列Hとの積と、元行列Vとの差分の絶対値を要素とする行列を示す。すなわち、本実施例においては、エネルギー関数Eとして、行列Wと行列Hとの積と、元行列Vとの差分の絶対値を要素とする行列を用いる。
【0027】
次に、スピン抽出部133は、行列分解処理において、変更対象とするスピンを選択するとともに、スピンの変更を繰り返す回数である試行回数を設定する。なお、スピン抽出部133は、選択部の一例である。
【0028】
スピン抽出部133は、例えば候補行列の積「W°H」と元行列Vとの差分行列の要素「deltaV」を検出する。スピン抽出部133は、deltaVが「1」となる要素の位置Nを抽出する。スピン抽出部133は、抽出したNの行番号Nw及び列番号Nhをスピン変更部134に出力する。
【0029】
なお、スピン抽出部133は、候補抽出個数として、例えば任意の値「p」を設定し、要素の位置Nがp個を超える場合、要素の位置Nのうちp個を選択して抽出する。また、スピン抽出部133は、要素の位置Nの数がp個以下である場合は、全ての要素の位置Nを選択して抽出する。
【0030】
また、スピン抽出部133は、例えば設定した「p」に基づいて、試行回数Ndを設定し、スピン変更部134に出力する。試行回数Ndは、「2×k×p」により算出される。
【0031】
スピン抽出部133は、抽出したNの行番号Nw及び列番号Nhをスピン変更部134に出力する。例えば、スピン抽出部133は、抽出したNの行番号Nw1乃至Nwp、及びNの列番号Nh1乃至Nhpをスピン変更部134に出力する。スピン抽出部133は、Nw及びNhを選択して出力する処理をNd回繰り返す。
【0032】
スピン変更部134は、変更対象とするスピンを特定して、スピンを変更する。スピン変更部134は、例えばスピン抽出部133からNw1乃至Nwp及びNh1乃至Nhpの出力を受けると、いずれかの位置Nwx及びNhxを選択する。スピン変更部134は、例えば一様乱数を用いて、変更対象とするスピンの行及び列を選択する。スピン変更部134は、選択した位置の要素の値を変更する。スピン変更部134は、例えば選択した位置の要素の値が「0」である場合は「1」に変更し、また値が「1」である場合は「0」に変更する。そして、スピン変更部134は、変更後のスピンを含む候補行列W及びHを、エネルギー算出部136に出力する。
【0033】
温度制御部135は、シミュレーテッド・アニーリング処理に用いる温度を算出する。温度制御部135は、初期設定部132から出力を受けた温度の初期値T0を用いて、温度を算出して、判定部137に出力する。温度制御部135は、例えば以下の式(3)を用いて温度を算出する。なお、温度制御部135は、温度決定部の一例である。
【0034】
【数3】
【0035】
エネルギー算出部136は、エネルギー関数Eを用いて、エネルギーを算出する。エネルギー算出部136は、初期設定部132から候補行列のスピンの初期値W0及びH0の出力を受けると、エネルギー初期値Eprevを算出する。エネルギー算出部136は、式(2)に示すようなエネルギー関数EにW0及びH0を代入することにより、エネルギー初期値Eprevを算出する。そして、エネルギー算出部136は、算出したEprevを、判定部137に出力する。
【0036】
また、エネルギー算出部136は、初期設定部132から更新後の候補行列のスピンの出力を受けると、エネルギーEafterを算出する。エネルギー算出部136は、式(2)に示すようなエネルギー関数Eに更新後の候補行列のスピンを代入することにより、エネルギーEafterを算出する。そして、エネルギー算出部136は、算出したEafterを、判定部137に出力する。
【0037】
判定部137は、更新後の候補行列のスピンのエネルギーEafterと、更新前の候補行列のスピンのエネルギー初期値Eprevとを比較する。なお、スピン変更部134、エネルギー算出部136及び判定部137は、計算部の一例である。
【0038】
判定部137は、EafterがEprevよりも小さいと判定した場合、EprevにEafterを代入する。一方、判定部137は、EafterがEprev以上であると判定した場合、例えば以下の式(4)を用いて確率Pを算出する。
【0039】
【数4】
【0040】
そして、判定部137は、0乃至1の間で一様乱数Mを発生させ、乱数Mと確率Pとを比較する。判定部137は、乱数Mが確率Pよりも大きい場合、EprevにEafterを代入する。一方、判定部137は、乱数Mが確率P以下である場合、スピンWmin及びHminの変更を棄却する。
【0041】
次に、判定部137は、スピンWminとHminとの積WminHminが、元行列Vと一致するか否かを判定する。例えば、判定部137は、WminとHminとのブール代数による積Wmin°Hminと元行列Vとを比較する。判定部137は、VとWmin°Hminとが一致する場合、WminとHminとを解行列として入出力部131に出力する。
【0042】
一方、判定部137は、VとWmin°Hminとが一致しない場合、スピン選択回数が試行回数Ndに到達したか否かを判定する。判定部137は、スピン選択回数が試行回数Ndに満たないと判定した場合、スピン抽出部133にスピンを変更する処理を繰り返させる。
【0043】
判定部137は、スピン選択回数が試行回数Ndに到達した場合、イテレーション回数iterをインクリメントし、iterが総イテレーション回数itermaxに到達したか否かを判定する。判定部137は、iterが総イテレーション回数itermaxに満たないと判定した場合、温度制御部135に温度Tを算出する処理を繰り返させる。一方、判定部137は、iterが総イテレーション回数itermaxに到達したと判定した場合、処理を終了する。なお、処理を終了する際に、解行列W及びHに近似する行列として、Wmin及びHminを出力するような構成であってもよい。
【0044】
[処理の流れ]
次に、本実施例における処理について、
図3A及び
図3Bを用いて説明する。
図3Aは、実施例1における行列分解処理の一例を示すフローチャートである。
図3Aに示すように、行列分解装置100の入出力部131は、例えば図示しない通信部又は入力装置等を通じて、行列Vの入力を受け付けるまで待機する(S100:No)。
【0045】
入出力部131は、行列Vの入力を受け付けたと判定した場合(S100:Yes)、行列Vを初期設定部132に出力する。初期設定部132は、行列Vの大きさm及びnを特定する(S101)。
【0046】
次に、入出力部131は、ランク数kの入力を受け付け、初期設定部132に出力する(S102)。初期設定部132は、温度の初期値T0を設定し、温度制御部135に出力する(S103)。次に、初期設定部132は、総イテレーション回数itermaxを設定し、判定部137に出力する(S104)。
【0047】
また、初期設定部132は、エネルギー関数Eを生成する(S105)。そして、初期設定部132は、スピンの初期値W0及びH0を設定し、エネルギー関数E及び行列Vとともにスピン抽出部133及びエネルギー算出部136に出力する(S110)。
【0048】
エネルギー算出部136は、スピンの初期値W0及びH0と、行列Vと、エネルギー関数Eとを用いて、エネルギーの初期値Eprevを算出する(S111)。次に、温度制御部135は、T0とイテレーション回数iterとを用いて、温度Tを算出する(S112)。
【0049】
次に、スピン抽出部133は、候補抽出個数pを設定する(S113)。そして、スピン抽出部133は、候補行列の積「W°H」と元行列Vとの差分行列の要素「deltaV」を検出する。スピン抽出部133は、deltaVが「1」となる要素の位置Nを抽出する(S114)。
【0050】
そして、スピン抽出部133は、要素の位置Nの数がp個未満であるか否かを判定する(S120)。スピン抽出部133は、要素の位置Nの数がp個未満であると判定した場合(S120:Yes)、全てのNを抽出し(S121)、S130に移行する。一方、スピン抽出部133は、要素の位置Nの数がp個以上であると判定した場合(S120:No)、要素の位置Nのうちp個を抽出し(S122)、S130に移行する。
【0051】
そして、スピン抽出部133は、抽出したNの行番号Nw及び列番号Nhをスピン変更部134に出力する(S130)。また、スピン抽出部133は、例えば設定した候補抽出個数pに基づいて、試行回数Ndを設定し、スピン変更部134に出力する(S131)。
【0052】
次に、スピン変更部134は、変更対象とするスピンの行及び列を選択する(S132)。例えば、スピン変更部134は、一様乱数を用いて、変更対象とするスピンの行及び列を選択する。スピン変更部134は、選択した位置の要素の値を変更する(S133)。そして、エネルギー算出部136は、エネルギーEafterを算出し(S134)、端子Aを通じてS140に移行する。
【0053】
図3Bは、実施例1における行列分解処理の一例を示すフローチャートである。
図3Bに示すように、判定部137は、EafterがEprevよりも小さいか否かを判定する(S140)。判定部137は、EafterがEprevよりも小さいと判定した場合(S140:Yes)、EprevにEafterを代入し(S141)、S150に移行する。
【0054】
一方、判定部137は、EafterがEprev以上であると判定した場合(S140:No)、確率Pを算出する(S142)。そして、判定部137は、乱数Mを発生させ(S143)、乱数Mが確率Pよりも大きいか否かを判定する(S144)。
【0055】
判定部137は、乱数Mが確率Pよりも大きいと判定した場合(S144:Yes)、S141に移行する。一方、判定部137は、乱数Mが確率P以下であると判定した場合(S144:No)、スピンWmin及びHminの変更を棄却し(S145)、S150に移行する。
【0056】
次に、判定部137は、スピンWminとHminとの積WminHminが、元行列Vと一致するか否かを判定する(S150)。判定部137は、元行列Vと積WminHminとが一致すると判定した場合(S150:Yes)、Wmin及びHminを入出力部131に出力する。そして、入出力部131は、解行列としてWmin及びHminを出力し(S151)、処理を終了する。
【0057】
一方、判定部137は、元行列Vと積WminHminとが一致しないと判定した場合(S150:No)、スピン選択回数が試行回数Ndに到達したか否かを判定する(S160)。判定部137は、スピン選択回数が試行回数Ndに到達していないと判定した場合(S160:No)、端子Bを通じてS113に戻り、処理を繰り返す。
【0058】
判定部137は、スピン選択回数が試行回数Ndに到達したと判定した場合(S160:Yes)、イテレーション回数iterを1インクリメントする(S161)。そして、判定部137は、イテレーション回数iterが、総イテレーション回数itermaxに到達したか否かを判定する(S170)。
【0059】
判定部137は、スピン選択回数が試行回数Ndに到達していないと判定した場合(S170:No)、端子Cを通じてS112に戻り、処理を繰り返す。一方、判定部137は、スピン選択回数が試行回数Ndに到達したと判定した場合(S170:Yes)、処理を終了する。
【0060】
[効果]
以上説明したように、本実施例における行列分解装置は、分解対象の行列を、第1の解行列と第2の解行列とに分解する。行列分解装置は、分解対象の行列に基づいて、エネルギー関数を生成する。行列分解装置は、温度の初期値に基づいて、アニーリングを行う温度を決定する。行列分解装置は、更新後の第1の行列と更新後の第2の行列との積を、分解対象の行列から引いた差分の絶対値を要素とする行列において、要素が1となる複数の位置情報を抽出する。行列分解装置は、ランク数と複数の位置情報とに基づいてスピンを変化させる試行回数を決定する。行列分解装置は、所定の繰り返し回数だけ、生成されたエネルギー関数に従い、更新後の第1の行列と更新後の第2の行列とに基づき、更新後のエネルギー関数を計算する。行列分解装置は、選択列番号情報に対応する第1の行列のスピンと、選択行番号情報に対応する第2の行列のスピンとをそれぞれ変化させる。行列分解装置は、変化後の第1の行列のスピンと変化後の第2の行列のスピンとを用いて変化後のエネルギー値を計算する。行列分解装置は、変化後のエネルギー値が更新後のエネルギー値よりも小さい場合、更新後のエネルギー値を変化後のエネルギー値、変化後の第1の行列のスピンを含む第1の行列を更新後の第1の行列、変化後の第2の行列のスピンを含む第2の行列を更新後の第2の行列にそれぞれ更新することを繰り返す。行列分解装置は、更新後の第1の行列と更新後の第2の行列の積が分解対象の行列と等しい場合、更新後の第1の行列を第1の解行列とし、更新後の第2の行列を第2の解行列とする。行列分解装置は、試行回数だけ、複数の位置情報に含まれる複数の列番号情報から、1つの選択列番号情報を選択するとともに、複数の位置情報に含まれる複数の行番号情報から、1つの選択行番号情報を選択することを繰り返す。これにより、要素の不一致を抑制できる。
【0061】
また、本実施例における行列分解装置は、乱数に基づいて選択列番号情報を選択するとともに、乱数に基づいて選択行番号情報を選択する。さらに、本実施例における行列分解装置は、変化後のエネルギー値が更新後のエネルギー値よりも大きい場合、温度決定部により決定されたアニーリングを行う温度を用いて乱数を発生させる。行列分解装置は、乱数が所定の確率値以上である場合に、更新後のエネルギー値を変化後のエネルギー値に更新する。また、行列分解装置は、乱数が所定の確率値以上である場合に、変化後の第1の行列のスピンを含む第1の行列を更新後の第1の行列、変化後の第2の行列のスピンを含む第2の行列を更新後の第2の行列にそれぞれ更新する。これにより、局所的最適解に陥ることなく、理論上は大域的最適解を算出できる。
【0062】
本実施例における行列分解装置100を用いる効果について、
図4を用いて説明する。
図4は、実施例1における行列分解処理結果の一例を示す図である。
図4は、背景技術における行列分解処理結果4000の一例と、本実施例における行列分解処理結果5000の一例とを示す。
図4において、行列V’は、候補行列Wと候補行列Hとの積を示す。行列V’の要素のうち、網掛けされた要素は、行列Vと行列V’との間で不一致が生じた要素を示す。
【0063】
図4に示すように、背景技術における行列分解処理結果4000においては、6つの要素において不一致が生じている。一方、本実施例における行列分解処理結果5000においては、不一致が生じた要素は3つに留まる。このように、本実施例においては、行列分解処理における要素の不一致を抑制できる。
【実施例2】
【0064】
実施例1に示すようなシミュレーテッド・アニーリング処理を用いた行列分解処理は、局所的最適解に陥ることなく、理論上は大域的最適解を算出できるという利点がある一方、計算量が膨大になる場合がある。そこで、本実施例においては、計算量を削減できる行列分解処理について説明する。
【0065】
本実施例における行列分解装置200は、変更対象とするスピンを、乱数に基づくのではなく、分解対象の行列と、分解した行列の積との差に基づいて決定する。なお、以下において、変更対象とするスピンを、単に「変更スピン」と表記する場合がある。また、行列分解装置200は、
図2に示す行列分解装置100と同様の構成により実現できるため、詳細な図示は省略する。
【0066】
本実施例における変更対象とするスピンの選択について、
図5を用いて説明する。
図5は、実施例2における変更対象のスピンの一例を示す図である。
図5において、要素3001は、候補行列の積「W°H」と元行列Vとの差分行列の要素「deltaV」のうち、差が発生している要素、例えばdeltaV=1である要素(nW,nH)を示す。この場合において、本実施例における図示しない行列分解装置200は、要素3001におけるdeltaVを0とするために、当該要素に関係するスピンを変化させる。
【0067】
例えば、本実施例における行列分解装置200は、
図5に示すように、要素3001に関係する行(nW)に関する行番号3011を、選択行番号として特定する。同様に、本実施例における行列分解装置200は、要素3001に関係する列(nH)に関する列番号3021を、選択列番号として特定する。このように、本実施例における行列分解装置200は、例えばdeltaV=1である要素に基づいて、選択行番号情報及び選択列番号情報を選択する。これにより、差が発生していない、例えばdeltaV=0である要素に関係するスピンの変化をさせなくなるため、計算回数を削減できる。
【0068】
また、
図5においては、例えばdeltaV=1である要素が1つである場合について説明したが、例えば複数の要素においてdeltaV=1である場合、deltaV=1である要素の個数に応じて、選択行番号情報及び選択列番号情報を選択してもよい。
図6は、実施例2における行列分解処理の経過の一例を示す図である。
図6は、各行及び各列における、例えばdeltaV=1である要素の数を、ヒストグラム化して示したものである。
図6において、網掛けされた要素3101は、例えばdeltaV=1である要素を示す。また、数字3111は、各行におけるdeltaV=1である要素の数を示す。同様に、数字3121は、各列におけるdeltaV=1である要素の数を示す。
【0069】
本実施例において、行列分解装置200は、各行のうち、deltaV=1である要素の数が多い上位p1個の行を選択する。
図6においては、例えばp1=1である場合において、deltaV=1である要素の数が最も多い行3112が選択されることを示す。同様に、本実施例において、行列分解装置200は、各列のうち、deltaV=1である要素の数が多い上位p2個の列を選択する。
図6においては、例えばp2=1である場合において、deltaV=1である要素の数が最も多い列3122が選択されることを示す。
【0070】
このように、本実施例において、行列分解装置200は、deltaV=1である要素が多い行及び列のスピンを変更対象として選択する。これにより、差が小さい、例えばdeltaV=1である要素が少ない行及び列に関係するスピンの変化をさせなくなるため、計算回数を削減できる。
【0071】
[処理の流れ]
次に、本実施例における処理について、
図7を用いて説明する。
図7は、実施例2における変更スピン選択処理の一例を示すフローチャートである。なお、
図7は、
図3AのS132における処理の詳細を示すものである。
【0072】
図7に示すように、本実施例における行列分解装置200は、
図6に示すような、各行におけるdeltaV=1である要素の数のヒストグラムを生成する(S200)。次に、行列分解装置200は、deltaV=1となる要素の数が多い順に、p1個の行を選択する(S201)。
【0073】
同様に、行列分解装置200は、各列におけるdeltaV=1である要素の数のヒストグラムを生成する(S202)。次に、行列分解装置200は、deltaV=1となる要素の数が多い順に、p2個の列を選択する(S203)。
【0074】
[効果]
以上説明したように、本実施例における行列分解装置は、第1の行列と第2の行列の積と、分解対象の行列との差に基づいて選択列番号情報として選択するとともに、第1の行列と第2の行列の積と、分解対象の行列との差に基づいて選択行番号情報として選択する。これにより、計算量を削減できる。
【0075】
本実施例における行列分解処理の効果について、
図8を用いて説明する。
図8は、行列分解処理速度の比較の一例を示す図である。
図8は、エネルギーを縦軸とし、イテレーション回数を横軸として、シミュレーテッド・アニーリング処理におけるエネルギーの変化をプロットしたグラフを示す。
【0076】
図8において、グラフ3301は、変更するスピンを一様乱数を用いて選択した場合におけるエネルギーの変化を示し、グラフ3302は、変更するスピンを、deltaV=1となる要素に基づいて選択した場合におけるエネルギーの変化を示す。
図8に示すように、deltaV=1となる要素に基づいて変更するスピンを選択する場合、一様乱数を用いる場合と比べて、少ない計算回数でエネルギーを低下させることができる。
【実施例3】
【0077】
上記実施例においては、ブール代数による積である第1の行列と第2の行列との積を算出する構成について説明したが、行列分解装置の実施の形態はこれに限られず、例えば各行列の要素の値が2の剰余系などの有限体の系を満たす場合にも適用できる。また、行列分解装置は、各行列の要素の値が離散値であり、整数の系を満たす場合にも適用することができる。本実施例においては、行列分解装置300が、ブール代数系を満たさないような行列を分解する構成について説明する。なお、行列分解装置300は、
図2に示す行列分解装置100と同様の構成により実現できるため、詳細な図示は省略する。
【0078】
行列の要素の値が異なる場合、例えば
図3AのS105に示すエネルギー関数Eを生成する処理も、行列の要素の値に応じて異なる。
図9は、実施例3におけるエネルギー関数生成処理の一例を示す図である。例えば、実施例1に示すように、行列の要素の値がブール代数系を満たす場合、S105aに示すように、式(1)によりエネルギー関数Eが設定される。
【0079】
一方、例えば行列の要素の値が2の剰余系を満たす場合、ブール代数系と同様に、V
ij^2=V
ijとなるとともに、V
ij×2=0となる。そこで、行列の要素の値が2の剰余系を満たす場合、S105bに示すような式によりエネルギー関数Eが設定される。
【0080】
また、例えば行列の要素の値が離散値であり、整数の系を満たす場合、V
ijの下限算及び乗算は整数となる。この場合、S105cに示すような式によりエネルギー関数Eが設定される。
【0081】
また、行列の要素の値が2の剰余系を満たす場合や、整数の系を満たす場合においても、実施例2に示すように、第1の行列と第2の行列の積と、分解対象の行列との差に基づいて選択対象の行及び列を選択してもよい。
図10は、実施例3における行列分解処理の経過の一例を示す図である。
図10は、整数の系を満たす行列を分解した場合において、各行及び各列の要素のdeltaVの累計を、ヒストグラム化して示したものである。
図10においては、deltaVの値は0又は1だけではなく整数となるので、例えば要素3201に示すように、deltaVの値を各要素に示す。
【0082】
本実施例においても、行列分解装置300は、各行のうち、deltaVの値の累計が多い上位p1個の行を選択する。
図10においては、例えばp1=1である場合において、deltaVの値の累計が「14」と最も多い行3212が選択されることを示す。同様に、本実施例において、行列分解装置300は、各列のうち、deltaVの値の累計が多い上位p2個の列を選択する。
図10においては、例えばp2=1である場合において、deltaVの値の累計が「18」と最も多い列3222が選択されることを示す。
【0083】
なお、要素の値がブール代数系を満たす場合、又は2の剰余系を満たす場合においては、スピンW又はHを変更する際、元の値が「1」であれば「0」に変更し、元の値が「0」であれば「1」に変更する。一方、要素の値が整数の系を満たす場合は、スピンWを変更する際、Wが取りうる値の一様乱数を発生させ、変更前のスピンWprevとは一致しない値を採用するようにしてもよい。同様に、要素の値が整数の系を満たす場合、スピンHを変更する際、Hが取りうる値の一様乱数を発生させ、変更前のスピンHprevとは一致しない値を採用するようにしてもよい。
【0084】
[効果]
以上説明したように、本実施例において、更新後の第1の行列と更新後の第2の行列との積は、例えばブール代数による積であるが、これに限られず、2の剰余系による積としてもよく、また行列積としてもよい。これにより、要素の値がブール代数系を満たさないような行列を分解する際においても、要素の不一致を抑制できる。
【実施例4】
【0085】
ところで、要素の値が有限体の系を満たす離散値の行列の分解が困難であることに着目して、例えばマクエリス暗号のように、分解元の行列を公開鍵、分解後の行列を秘密鍵とする暗号技術が用いられている。上記の行列分解装置を、分解元の行列を公開鍵、分解後の行列を秘密鍵とする暗号の解読に用いてもよい。
【0086】
本実施例における行列分解装置600は、
図11に示すような公開鍵の行列を分解することにより、秘密鍵の行列を特定する。なお、行列分解装置600は、
図2に示す行列分解装置100と同様の構成により実現できるため、詳細な図示は省略する。
図11は、実施例4における公開鍵及び秘密鍵の一例を示す図である。
図11において、公開鍵であるk行n列行列G’は、秘密鍵であるk行k列行列Sとk行n列行列Gとを乗じて、さらに秘密鍵であるn行n列行列Pを乗じた行列である。本実施例における図示しない行列分解装置600は、公開鍵G’から秘密鍵G、S及びPを算出する。
【0087】
まず、行列分解装置600は、分解対象の行列G’を、行列Sと、行列G及び行列Pの積である行列Zとに分解する。次に、行列分解装置600は、行列Zを、行列Gと行列Pとに分解する。なお、行列Sは第1の解行列の一例であり、行列Gは第2の解行列の一例であり、行列Pは第3の解行列の一例である。また、行列Zは、第4の解行列の一例である。
【0088】
[処理の流れ]
次に、本実施例における処理について、
図12を用いて説明する。
図12は、実施例4における暗号解読処理の一例を示すフローチャートである。
図12に示すように、本実施例における行列分解装置600は、例えば図示しない通信部又は入力装置等を通じて、k行n列の行列G’の入力を受け付けるまで待機する(S400:No)。
【0089】
行列分解装置600は、行列G’の入力を受け付けたと判定した場合(S400:Yes)、行列G’を、G’=SZを満たすk行k列行列Sと、k行n列行列Zとに分解する(S410)。この際、行列分解装置600は、
図3A及び
図3Bに示すS103乃至S170の処理を繰り返すことにより、解行列S及びZを出力する。
【0090】
次に、行列分解装置600は、行列Zを、Z=GPを満たすk行n列行列Gと、n行n列行列Pとに分解する(S420)。この際、行列分解装置600は、
図3A及び
図3Bに示すS103乃至S170の処理を繰り返すことにより、解行列G及びPを出力する。
【0091】
[効果]
以上説明したように、本実施例において、行列分解装置は、分解対象の行列を、第1の解行列と第2の解行列と第3の解行列とに分解する。行列分解装置は、分解対象の行列に基づいて、エネルギー関数を生成する。行列分解装置は、温度の初期値に基づいて、アニーリングを行う温度を決定する。行列分解装置は、更新後の第1の行列と更新後の第4の行列との積を、分解対象の行列から引いた差分の絶対値を要素とする行列において、非ゼロ要素となる要素の複数の位置情報を抽出する。行列分解装置は、第1のランク数と複数の位置情報とに基づいてスピンを変化させる試行回数を決定する。行列分解装置は、所定の繰り返し回数だけ、生成されたエネルギー関数に従い、更新後の第1の行列と更新後の第2の行列とに基づき、更新後のエネルギー関数を計算する。行列分解装置は、選択列番号情報に対応する第1の行列のスピンと、選択行番号情報に対応する第2の行列のスピンとをそれぞれ変化させ、変化後の第1の行列のスピンと変化後の第2の行列のスピンとを用いて変化後のエネルギー値を計算する。行列分解装置は、変化後のエネルギー値が更新後のエネルギー値よりも小さい場合、更新後のエネルギー値を変化後のエネルギー値、変化後の第1の行列のスピンを含む第1の行列を更新後の第1の行列、変化後の第2の行列のスピンを含む第2の行列を更新後の第2の行列にそれぞれ更新することを繰り返す。行列分解装置は、更新後の第1の行列と更新後の第2の行列の積が分解対象の行列と等しい場合、更新後の第1の行列を第1の解行列とし、更新後の第2の行列を第4の行列とする。行列分解装置は、試行回数だけ、複数の位置情報に含まれる複数の列番号情報から、1つの選択列番号情報を選択するとともに、複数の位置情報に含まれる複数の行番号情報から、1つの選択行番号情報を選択することを繰り返す。行列分解装置は、更新後の第4の行列と更新後の第3の行列との積を、分解対象の行列から引いた差分の絶対値を要素とする行列において、非ゼロ要素となる要素の複数の位置情報を抽出する。行列分解装置は、第2のランク数と複数の位置情報とに基づいてスピンを変化させる試行回数を決定する。行列分解装置は、所定の繰り返し回数だけ、生成されたエネルギー関数に従い、更新後の第4の行列と更新後の第3の行列とに基づき、更新後のエネルギー関数を計算する。行列分解装置は、選択列番号情報に対応する第4の行列のスピンと、選択行番号情報に対応する第3の行列のスピンとをそれぞれ変化させ、変化後の第4の行列のスピンと変化後の第3の行列のスピンとを用いて変化後のエネルギー値を計算する。行列分解装置は、変化後のエネルギー値が更新後のエネルギー値よりも小さい場合、更新後のエネルギー値を変化後のエネルギー値、変化後の第4の行列のスピンを含む第4の行列を更新後の第4の行列、変化後の第3の行列のスピンを含む第3の行列を更新後の第3の行列にそれぞれ更新することを繰り返す。行列分解装置は、更新後の第4の行列と更新後の第3の行列の積が分解対象の行列と等しい場合、更新後の第4の行列を第2の解行列とし、更新後の第3の行列を第3の解行列とする。行列分解装置は、試行回数だけ、複数の位置情報に含まれる複数の列番号情報から、1つの選択列番号情報を選択するとともに、複数の位置情報に含まれる複数の行番号情報から、1つの選択行番号情報を選択することを繰り返す。これにより、例えばマクエリス暗号などの離散値の行列分解に基づく暗号の秘密鍵を、公開鍵から容易に解読することができる。
【実施例5】
【0092】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。
【0093】
例えば、
図3AのS110において、スピンの初期値W0又はH0は、全て「0」に設定され、又は全て「1」に設定されるが、これに限られない。本実施例における行列分解装置700は、例えば分解後の行列の積に含まれる非ゼロ要素の比率が、分解対象の行列Vに含まれる非ゼロ要素の比率に近似するように、スピンの初期値W0又はH0を設定してもよい。例えば、スピンの初期値W0及びH0に、分解対象の行列Vに含まれる非ゼロ要素の比率により重み付けされた0又は1の乱数を割り当ててもよい。これにより、初期段階での行列の積と分解対象の行列との差を小さくすることができる。なお、本実施例における行列分解装置700は、
図2に示す行列分解装置100と同様の構成により実現できるため、詳細な図示は省略する。
【0094】
なお、行列Vの非ゼロ要素の比率をYとする場合において、Yに係数rを乗じ、さらにランク数kを乗じた比率を用いて重み付け乱数を発生させてもよい。この場合において、係数rは、例えば乱数により発生した要素が、乗算及び加算により1となる平均確率である。係数rは、例えば要素がブール代数系を満たす場合には、乗算により1が発生する確率1/4と、加算により1が発生する確率3/4とを乗算した3/16となる。一方、例えば要素が2の剰余系を満たす場合には、乗算により1が発生する確率1/4と、加算により1が発生する確率2/4とを乗算した2/16となる。
【0095】
また、スピンの初期値W0及びH0に、0又は1の一様乱数を割り当ててもよい。また、スピンの初期値W0及びH0には、0から1までの連続値を割り当ててもよい。なお、スピンの初期値W0及びH0を全て「0」又は「1」に設定する場合においても、例えば分解対象の行列Vに含まれる全要素に示す非ゼロ要素の割合が半数以上であれば「1」を設定し、半数未満であれば「0」を設定するような構成であってもよい。
【0096】
例えば、本実施例における行列分解装置は、選択列番号情報及び選択行番号情報を選択する際に、乱数として、一様乱数を用いてもよく、重み付き乱数を用いてもよい。これにより、シミュレーテッド・アニーリング処理を最適化できる。
【0097】
[処理の流れ]
本実施例における、
図3AのS132において乱数を用いて変更スピンを選択する処理について、
図13乃至
図15を用いて説明する。
図13は、実施例5における変更スピン選択処理の一例を示すフローチャートである。
図13に示すように、本実施例における行列分解装置700は、WのNw1行目〜Nwp行目を、スピンの候補として選択する。また、行列分解装置700は、HのNh1列目〜Nhp列目を、スピンの候補として選択する。この場合において、行列分解装置700は、各行における重みをDw1〜Dwpとし、各列における重みをDh1〜Dhpとする(S501)。
【0098】
次に、行列分解装置700は、乱数の生成に際し、重み付けを利用するか否かを判定する(S502)。行列分解装置700は、重み付けを利用しないと判断した場合(S502:No)、一様乱数を発生させて、Nw1乃至Nwpのうち、いずれかの行を選択し(S503)、
図3AのS133に移行する。
【0099】
一方、行列分解装置700は、重み付けを利用すると判定した場合(S502:Yes)、重みDw1乃至Dwp及びDh1乃至Dhpを用いて、重み付き乱数rndを発生させる(S511)。rndを発生させる処理については、後に
図14を用いて説明する。
【0100】
行列分解装置700は、発生させたrndに基づき、Nw1乃至Nwpのうち、いずれかの行を選択する(S512)。同様に、行列分解装置700は、発生させたrndに基づき、Nh1乃至Nhpのうち、いずれかの列を選択する(S513)。
【0101】
次に、行列分解装置700は、選択した行に含まれるいずれかの要素Wsを、一様乱数を用いて1つ選択する(S514)。同様に、行列分解装置700は、選択した列に含まれるいずれかの要素Hsを、一様乱数を用いて1つ選択し(S515)、
図3AのS133に移行する。
【0102】
次に、S511における乱数rndを生成する処理の詳細について、
図14を用いて説明する。
図14は、実施例5における乱数生成処理の一例を示すフローチャートである。
図14に示すように、行列分解装置700は、重みDw1乃至Dwpが格納されたベクトルDwを取得する(S600)。次に、行列分解装置700は、重みDw1乃至Dwpのそれぞれの大きさに合わせた区間を表すwp×2の配列wを取得する(S601)。配列wは、例えば重みDw1乃至Dwpがそれぞれ「3、3、5」である場合、c「1,1」=1となる。同様に、c[1,2]=3、c[2,1]=4、c[2,2]=6、c[3,1]=7、c[3,2]=11となる。
【0103】
次に、行列分解装置700は、c[0,2]=0とし(S602)、1乃至pについて、c[n,1]=c[n−1,2]+1とする(S603)。同様に、行列分解装置700は、c[n,2]=c[n,1]+Dw[n]−1とする(S604)。
【0104】
そして、行列分解装置700は、区間1乃至Σ
pDwpの間で、一様乱数rnd2を生成する(S605)。行列分解装置700は、c[k,1]≦rnd2≦c[k,2]となるkを特定し(S606)、kを乱数rndとして出力する(S607)。
【0105】
図15は、実施例5における乱数生成結果の一例を示す図である。
図15において、例えばrnd2が「5」である場合、rnd2はc[2,1]以上であり、かつc[2,2]以下である。この場合、行列分解装置700は、k=2を、乱数rndとして発生させる。これにより、
図6又は
図10に示すような重みを反映させた乱数を発生させることができる。
【0106】
[温度算出処理]
また、上記の実施例においては、
図3AのS112に示す温度Tを算出する処理において、式(3)に示すように、イテレーション回数の対数の逆数を温度Tとして算出しているが、実施の形態はこれに限られない。例えば、温度をイテレーション回数の逆数とすることにより、温度の低下が緩やかになるような構成であってもよい。また、温度をイテレーション回数の指数の逆数とすることにより、温度が急激に低下するような構成であってもよい。
【0107】
図3AのS112における処理の詳細について、
図16を用いて説明する。
図16は、実施例5における温度算出処理の一例を示すフローチャートである。
図16に示すように、温度制御部135は、温度の初期値T0と、イテレーション回数iterとを取得する(S701)。次に、温度制御部135は、例えば式(3)に示すようなイテレーション回数の対数の逆数を温度Tとして算出する(S711)。一方、温度制御部135は、イテレーション回数の指数の逆数を温度Tとして算出してもよい(S712)。また、温度制御部135は、イテレーション回数の逆数を温度Tとして算出してもよい(S713)。
【0108】
[スピンsの値]
なお、上記の実施例においては、スピンsの値が{0,1}である例について説明したが、実施の形態はこれに限られない。例えば、{−1,1}であるような値をとるδをスピンの値とするような構成であってもよい。かかるスピンδの値とスピンsの値との関係は、例えばs=(δ+1)/2のような数式により示される。
【0109】
[システム]
次に、上記実施例に示した行列分解プログラムを実行するコンピュータの一例について説明する。
図17は、行列分解装置のハードウェア構成の一例を示す図である。
図17に示すように、コンピュータ400は、各種演算処理を実行するCPU401と、ユーザからのデータ入力を受け付ける入力装置402と、モニタ403とを有する。また、コンピュータ400は、各種情報を一時記憶するRAM(Random Access Memory)404と、ハードディスク装置405とを有する。また、各装置401〜405は、バス406に接続される。
【0110】
ハードディスク装置405には、例えば、
図2に示した各処理部と同様の機能を有する情報処理プログラムが記憶される。また、ハードディスク装置405には、情報処理プログラムを実現するための各種データが記憶される。
【0111】
CPU401は、ハードディスク装置405に記憶された各プログラムを読み出して、RAM404に展開して実行することで、各種の処理を行う。これらのプログラムは、コンピュータ400を
図2に示した各処理部として機能させることができる。
【0112】
なお、上記の情報処理プログラムは、必ずしもハードディスク装置405に記憶されている必要はない。例えば、コンピュータ400が読み取り可能な記憶媒体に記憶されたプログラムを、コンピュータ400が読み出して実行するようにしてもよい。コンピュータ400が読み取り可能な記憶媒体は、例えば、CD−ROMやDVDディスク、USB(Universal Serial Bus)メモリ等の可搬型記録媒体、フラッシュメモリ等の半導体メモリ、ハードディスクドライブ等が対応する。また、公衆回線、インターネット、LAN(Local Area Network)等に接続された装置にこのプログラムを記憶させておき、コンピュータ400がこれらからプログラムを読み出して実行するようにしてもよい。