情報学部 | 菅沼ホーム | 目次 | 索引 |
/****************************/ /* 競合学習 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <stdlib.h> #include <ctime> #include "MT.h" /***************************/ /* Competitionクラスの定義 */ /***************************/ class Competition { long max; // 最大学習回数 long n; // 訓練例の数 long o; // 出力セルの数 long p; // 入力セルの数 long **E; // 訓練例 double **W; // 重み double sig; // 重み修正係数 public: Competition(long, long, long, long, long, double); ~Competition(); void Input(char *); void Learn(int, char *name = ""); }; /******************/ /* コンストラクタ */ /******************/ Competition::Competition(long max_i, long n_i, long o_i, long p_i, long seed, double sig_i) { long i1; /* 設定 */ sig = sig_i; max = max_i; n = n_i; o = o_i; p = p_i; init_genrand(seed); /* 領域の確保 */ E = new long * [n]; for (i1 = 0; i1 < n; i1++) E[i1] = new long [p]; W = new double * [o]; for (i1 = 0; i1 < o; i1++) W[i1] = new double [p]; } /****************/ /* デストラクタ */ /****************/ Competition::~Competition() { int i1; for (i1 = 0; i1 < n; i1++) delete [] E[i1]; delete [] E; for (i1 = 0; i1 < o; i1++) delete [] W[i1]; delete [] W; } /**************************/ /* 学習データの読み込み */ /* name : ファイル名 */ /**************************/ void Competition::Input(char *name) { long i1, i2; FILE *st; st = fopen(name, "r"); for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < p; i2++) fscanf(st, "%ld", &E[i1][i2]); } fclose(st); } /*********************************/ /* 学習と結果の出力 */ /* pr : =0 : 画面に出力 */ /* =1 : ファイルに出力 */ /* name : 出力ファイル名 */ /*********************************/ void Competition::Learn(int pr, char *name) { double mx_v = 0.0, s, sum; long count, i1, i2, i3, k, mx = 0; FILE *out; /* 初期設定 */ for (i1 = 0; i1 < o; i1++) { sum = 0.0; for (i2 = 0; i2 < p; i2++) { W[i1][i2] = genrand_real3(); sum += W[i1][i2]; } sum = 1.0 / sum; for (i2 = 0; i2 < p; i2++) W[i1][i2] *= sum; } /* 学習 */ for (count = 0; count < max; count++) { // 訓練例の選択 k = (long)(genrand_real3() * n); if (k >= n) k = n - 1; // 出力の計算 for (i1 = 0; i1 < o; i1++) { s = 0.0; for (i2 = 0; i2 < p; i2++) s += W[i1][i2] * E[k][i2]; if (i1 == 0 || s > mx_v) { mx = i1; mx_v = s; } } // 重みの修正 sum = 0.0; for (i1 = 0; i1 < p; i1++) sum += E[k][i1]; for (i1 = 0; i1 < p; i1++) W[mx][i1] += sig * (E[k][i1] / sum - W[mx][i1]); } /* 出力 */ if (pr == 0) out = stdout; else out = fopen(name, "w"); fprintf(out, "分類結果\n"); for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < p; i2++) fprintf(out, "%2ld", E[i1][i2]); fprintf(out, " Res "); for (i2 = 0; i2 < o; i2++) { s = 0.0; for (i3 = 0; i3 < p; i3++) s += W[i2][i3] * E[i1][i3]; if (i2 == 0 || s > mx_v) { mx = i2; mx_v = s; } } fprintf(out, "%3ld\n", mx+1); } } /****************/ /* main program */ /****************/ int main(int argc, char *argv[]) { double sig; long max, n, p, o; unsigned long seed = (unsigned)time(NULL); char name[100]; FILE *st; if (argc > 1) { // 基本データの入力 st = fopen(argv[1], "r"); fscanf(st, "%*s %ld %*s %ld %*s %ld %*s %ld %*s %lf", &max, &p, &o, &n, &sig); fscanf(st, "%*s %s", name); fclose(st); // ネットワークの定義 Competition net(max, n, o, p, seed, sig); net.Input(name); // 学習と結果の出力 if (argc == 2) net.Learn(0); else net.Learn(1, argv[2]); } else { printf("***error 入力データファイル名を指定して下さい\n"); exit(1); } return 0; } /* ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 //---------------------MT.h--------------------------- // A C-program for MT19937, with initialization improved 2002/1/26. // Coded by Takuji Nishimura and Makoto Matsumoto. // // Before using, initialize the state by using init_genrand(seed) // or init_by_array(init_key, key_length). // // Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions // are met: // // 1. Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // 3. The names of its contributors may not be used to endorse or promote // products derived from this software without specific prior written // permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // // Any feedback is very welcome. // http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html // email: m-mat @ math.sci.hiroshima-u.ac.jp (remove space) // The original version of http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/CODES/mt19937ar.c was modified by Takahiro Omi as // - delete line 47 "#include<stdio.h>" // - delete line 174 int main(void){...} // - change N -> MT_N // - change N -> MT_N // - change the file name "mt19937ar.c" -> "MT.h" // Period parameters #define MT_N 624 #define MT_M 397 #define MATRIX_A 0x9908b0dfUL // constant vector a #define UPPER_MASK 0x80000000UL // most significant w-r bits #define LOWER_MASK 0x7fffffffUL // least significant r bits static unsigned long mt[MT_N]; // the array for the state vector static int mti=MT_N+1; // mti==MT_N+1 means mt[MT_N] is not initialized // initializes mt[MT_N] with a seed void init_genrand(unsigned long s) { mt[0]= s & 0xffffffffUL; for (mti=1; mti<MT_N; mti++) { mt[mti] = (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti); // See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. // In the previous versions, MSBs of the seed affect // only MSBs of the array mt[]. // 2002/01/09 modified by Makoto Matsumoto mt[mti] &= 0xffffffffUL; // for >32 bit machines } } // initialize by an array with array-length // init_key is the array for initializing keys // key_length is its length // slight change for C++, 2004/2/26 void init_by_array(unsigned long init_key[], int key_length) { int i, j, k; init_genrand(19650218UL); i=1; j=0; k = (MT_N>key_length ? MT_N : key_length); for (; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL)) + init_key[j] + j; // non linear mt[i] &= 0xffffffffUL; // for WORDSIZE > 32 machines i++; j++; if (i>=MT_N) { mt[0] = mt[MT_N-1]; i=1; } if (j>=key_length) j=0; } for (k=MT_N-1; k; k--) { mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL)) - i; // non linear mt[i] &= 0xffffffffUL; // for WORDSIZE > 32 machines i++; if (i>=MT_N) { mt[0] = mt[MT_N-1]; i=1; } } mt[0] = 0x80000000UL; // MSB is 1; assuring non-zero initial array } // generates a random number on [0,0xffffffff]-interval unsigned long genrand_int32(void) { unsigned long y; static unsigned long mag01[2]={0x0UL, MATRIX_A}; // mag01[x] = x * MATRIX_A for x=0,1 if (mti >= MT_N) { // generate N words at one time int kk; if (mti == MT_N+1) // if init_genrand() has not been called, init_genrand(5489UL); // a default initial seed is used for (kk=0;kk<MT_N-MT_M;kk++) { y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); mt[kk] = mt[kk+MT_M] ^ (y >> 1) ^ mag01[y & 0x1UL]; } for (;kk<MT_N-1;kk++) { y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); mt[kk] = mt[kk+(MT_M-MT_N)] ^ (y >> 1) ^ mag01[y & 0x1UL]; } y = (mt[MT_N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); mt[MT_N-1] = mt[MT_M-1] ^ (y >> 1) ^ mag01[y & 0x1UL]; mti = 0; } y = mt[mti++]; // Tempering y ^= (y >> 11); y ^= (y << 7) & 0x9d2c5680UL; y ^= (y << 15) & 0xefc60000UL; y ^= (y >> 18); return y; } // generates a random number on [0,0x7fffffff]-interval long genrand_int31(void) { return (long)(genrand_int32()>>1); } // generates a random number on [0,1]-real-interval double genrand_real1(void) { return genrand_int32()*(1.0/4294967295.0); // divided by 2^32-1 } // generates a random number on [0,1)-real-interval double genrand_real2(void) { return genrand_int32()*(1.0/4294967296.0); // divided by 2^32 } // generates a random number on (0,1)-real-interval double genrand_real3(void) { return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0); // divided by 2^32 } // generates a random number on [0,1) with 53-bit resolution double genrand_res53(void) { unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6; return(a*67108864.0+b)*(1.0/9007199254740992.0); } // These real versions are due to Isaku Wada, 2002/01/09 added */
/****************************/ /* 競合学習 */ /* coded by Y.Suganuma */ /****************************/ import java.io.*; import java.util.Random; import java.util.StringTokenizer; public class Test { /****************/ /* main program */ /****************/ public static void main(String args[]) throws IOException, FileNotFoundException { double sig; int max, n, o, p; String name; StringTokenizer str; if (args.length > 0) { // 基本データの入力 BufferedReader in = new BufferedReader(new FileReader(args[0])); str = new StringTokenizer(in.readLine(), " "); str.nextToken(); max = Integer.parseInt(str.nextToken()); str.nextToken(); p = Integer.parseInt(str.nextToken()); str.nextToken(); o = Integer.parseInt(str.nextToken()); str.nextToken(); n = Integer.parseInt(str.nextToken()); str.nextToken(); sig = Double.parseDouble(str.nextToken()); str = new StringTokenizer(in.readLine(), " "); str.nextToken(); name = str.nextToken(); in.close(); // ネットワークの定義 Competition net = new Competition (max, n, o, p, sig); net.input(name); // 学習と結果の出力 if (args.length == 1) net.learn(0, ""); else net.learn(1, args[1]); } // エラー else { System.out.print("***error 入力データファイル名を指定して下さい\n"); System.exit(1); } } } /***************************/ /* Competitionクラスの定義 */ /***************************/ class Competition { private int max; // 最大学習回数 private int n; // 訓練例の数 private int o; // 出力セルの数 private int p; // 入力セルの数 private int E[][]; // 訓練例 private double W[][]; // 重み private double sig; // 重み修正係数 private Random rn; // 乱数 /******************/ /* コンストラクタ */ /******************/ Competition (int max_i, int n_i, int o_i, int p_i, double sig_i) { /* 設定 */ max = max_i; n = n_i; o = o_i; p = p_i; sig = sig_i; rn = new Random(); // 乱数の初期設定 /* 領域の確保 */ E = new int [n][p]; W = new double [o][p]; } /**************************/ /* 学習データの読み込み */ /* name : ファイル名 */ /**************************/ void input (String name) throws IOException, FileNotFoundException { int i1, i2; StringTokenizer str; BufferedReader st = new BufferedReader(new FileReader(name)); for (i1 = 0; i1 < n; i1++) { str = new StringTokenizer(st.readLine(), " "); for (i2 = 0; i2 < p; i2++) E[i1][i2] = Integer.parseInt(str.nextToken()); } st.close(); } /*********************************/ /* 学習と結果の出力 */ /* pr : =0 : 画面に出力 */ /* =1 : ファイルに出力 */ /* name : 出力ファイル名 */ /*********************************/ void learn(int pr, String name) throws FileNotFoundException { double mx_v = 0.0, s, sum; int count, i1, i2, i3, k, mx = 0; /* 初期設定 */ for (i1 = 0; i1 < o; i1++) { sum = 0.0; for (i2 = 0; i2 < p; i2++) { W[i1][i2] = rn.nextDouble(); sum += W[i1][i2]; } sum = 1.0 / sum; for (i2 = 0; i2 < p; i2++) W[i1][i2] *= sum; } /* 学習 */ for (count = 0; count < max; count++) { // 訓練例の選択 k = (int)(rn.nextDouble() * n); if (k >= n) k = n - 1; // 出力の計算 for (i1 = 0; i1 < o; i1++) { s = 0.0; for (i2 = 0; i2 < p; i2++) s += W[i1][i2] * E[k][i2]; if (i1 == 0 || s > mx_v) { mx = i1; mx_v = s; } } // 重みの修正 sum = 0.0; for (i1 = 0; i1 < p; i1++) sum += E[k][i1]; for (i1 = 0; i1 < p; i1++) W[mx][i1] += sig * (E[k][i1] / sum - W[mx][i1]); } /* 出力 */ if (pr == 0) { System.out.print("分類結果\n"); for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < p; i2++) System.out.print(" " + E[i1][i2]); System.out.print(" Res "); for (i2 = 0; i2 < o; i2++) { s = 0.0; for (i3 = 0; i3 < p; i3++) s += W[i2][i3] * E[i1][i3]; if (i2 == 0 || s > mx_v) { mx = i2; mx_v = s; } } System.out.println((mx+1)); } } else { PrintStream out = new PrintStream(new FileOutputStream(name)); out.print("分類結果\n"); for (i1 = 0; i1 < n; i1++) { for (i2 = 0; i2 < p; i2++) out.print(" " + E[i1][i2]); out.print(" Res "); for (i2 = 0; i2 < o; i2++) { s = 0.0; for (i3 = 0; i3 < p; i3++) s += W[i2][i3] * E[i1][i3]; if (i2 == 0 || s > mx_v) { mx = i2; mx_v = s; } } out.println((mx+1)); } out.close(); } } } /* ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 */
<!DOCTYPE HTML> <HTML> <HEAD> <TITLE>競合学習</TITLE> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <SCRIPT TYPE="text/javascript"> res = ""; net = null; /****************/ /* main program */ /****************/ function main() { // 基本データの入力 let max = parseInt(document.getElementById("max").value); let p = parseInt(document.getElementById("p").value); let o = parseInt(document.getElementById("o").value); let n = parseInt(document.getElementById("n").value); let sig = parseFloat(document.getElementById("sig").value); // ネットワークの定義 net = new Competition (max, n, o, p, sig); net.input(name); // 学習と結果の出力 net.learn(0, ""); document.getElementById("result").value = res; } /***************************/ /* Competitionオブジェクト */ /***************************/ function Competition (max_i, n_i, o_i, p_i, sig_i) { // // 設定 // this.max = max_i; this.n = n_i; this.o = o_i; this.p = p_i; this.sig = sig_i; // // 領域の確保 // this.E = new Array(this.n); for (let i1 = 0; i1 < this.n; i1++) this.E[i1] = new Array(this.p); this.W = new Array(this.o); for (let i1 = 0; i1 < this.o; i1++) this.W[i1] = new Array(this.p); } /************************/ /* 学習データの読み込み */ /************************/ Competition.prototype.input = function() { let lines = (document.getElementById("data").value).split('\n'); for (let i1 = 0; i1 < net.n; i1++) { let str = lines[i1].split(' ').filter(function(e){return e.length > 0;}); for (let i2 = 0; i2 < net.p; i2++) net.E[i1][i2] = parseInt(str[i2]); } } /********************/ /* 学習と結果の出力 */ /********************/ Competition.prototype.learn = function() { let mx_v = 0.0; let count, mx = 0; // // 初期設定 // for (let i1 = 0; i1 < net.o; i1++) { let sum = 0.0; for (let i2 = 0; i2 < net.p; i2++) { net.W[i1][i2] = Math.random(); sum += net.W[i1][i2]; } sum = 1.0 / sum; for (let i2 = 0; i2 < net.p; i2++) net.W[i1][i2] *= sum; } // // 学習 // for (count = 0; count < max; count++) { // 訓練例の選択 let k = Math.floor(Math.random() * net.n); if (k >= net.n) k = net.n - 1; // 出力の計算 for (let i1 = 0; i1 < net.o; i1++) { let s = 0.0; for (let i2 = 0; i2 < net.p; i2++) s += net.W[i1][i2] * net.E[k][i2]; if (i1 == 0 || s > mx_v) { mx = i1; mx_v = s; } } // 重みの修正 let sum = 0.0; for (let i1 = 0; i1 < net.p; i1++) sum += net.E[k][i1]; for (let i1 = 0; i1 < net.p; i1++) net.W[mx][i1] += net.sig * (net.E[k][i1] / sum - net.W[mx][i1]); } // // 出力 // res += "分類結果\n"; for (let i1 = 0; i1 < net.n; i1++) { for (let i2 = 0; i2 < net.p; i2++) res += (" " + net.E[i1][i2]); res += (" Res "); for (let i2 = 0; i2 < net.o; i2++) { let s = 0.0; for (let i3 = 0; i3 < net.p; i3++) s += net.W[i2][i3] * net.E[i1][i3]; if (i2 == 0 || s > mx_v) { mx = i2; mx_v = s; } } res += ((mx+1) + "\n"); } } </SCRIPT> </HEAD> <BODY STYLE="font-size: 130%; text-align:center; background-color: #eeffee;"> <H2><B>競合学習</B></H2> 最大試行回数:<INPUT ID="max" STYLE="font-size: 100%" TYPE="text" SIZE="2" VALUE="1000"> 入力セル数:<INPUT ID="p" STYLE="font-size: 100%" TYPE="text" SIZE="1" VALUE="9"> 出力セル数:<INPUT ID="o" STYLE="font-size: 100%" TYPE="text" SIZE="1" VALUE="3"> 訓練例数:<INPUT ID="n" STYLE="font-size: 100%" TYPE="text" SIZE="1" VALUE="9"> 係数(0~1):<INPUT ID="sig" STYLE="font-size: 100%" TYPE="text" SIZE="2" VALUE="0.1"> <BUTTON STYLE="font-size: 100%; background-color: pink" onClick="return main()">実行</BUTTON><BR> <DIV STYLE="width: 800px; margin-right: auto; margin-left: auto"> <DIV STYLE="text-align:center; float: right; width: 400px"> <DIV STYLE="text-align:center">分類結果</DIV> <TEXTAREA ID="result" COLS="35" ROWS="10" STYLE="font-size: 100%; width: 380px"> </TEXTAREA> </DIV> <DIV STYLE="text-align:center; width: 400px"> <DIV STYLE="text-align:center">入力データ</DIV> <TEXTAREA ID="data" COLS="35" ROWS="10" STYLE="font-size: 100%; width: 380px"> 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 </TEXTAREA> </DIV> </DIV> </BODY> </HTML>
<?php /****************************/ /* 競合学習 */ /* coded by Y.Suganuma */ /****************************/ /***************************/ /* Competitionクラスの定義 */ /***************************/ class Competition { private $max; // 最大学習回数 private $n; // 訓練例の数 private $o; // 出力セルの数 private $p; // 入力セルの数 private $E; // 訓練例 private $W; // 重み private $sig; // 重み修正係数 /******************/ /* コンストラクタ */ /******************/ function Competition($max_i, $n_i, $o_i, $p_i, $sig_i) { /* 設定 */ $this->sig = $sig_i; $this->max = $max_i; $this->n = $n_i; $this->o = $o_i; $this->p = $p_i; mt_srand(); /* 領域の確保 */ $this->E = array($this->n); for ($i1 = 0; $i1 < $this->n; $i1++) $this->E[$i1] = array($this->p); $this->W = array($this->o); for ($i1 = 0; $i1 < $this->o; $i1++) $this->W[$i1] = array($this->p); } /**************************/ /* 学習データの読み込み */ /* name : ファイル名 */ /**************************/ function Input($name) { $st = fopen($name, "rb"); for ($i1 = 0; $i1 < $this->n; $i1++) { $str = trim(fgets($st)); $this->E[$i1][0] = intval(strtok($str, " ")); for ($i2 = 1; $i2 < $this->p; $i2++) $this->E[$i1][$i2] = intval(strtok(" ")); } fclose($st); } /*********************************/ /* 学習と結果の出力 */ /* pr : =0 : 画面に出力 */ /* =1 : ファイルに出力 */ /* name : 出力ファイル名 */ /*********************************/ function Learn($pr, $name = "STDOUT") { $mx = 0; $mx_v = 0.0; /* 初期設定 */ for ($i1 = 0; $i1 < $this->o; $i1++) { $sum = 0.0; for ($i2 = 0; $i2 < $this->p; $i2++) { $this->W[$i1][$i2] = mt_rand() / mt_getrandmax(); $sum += $this->W[$i1][$i2]; } $sum = 1.0 / $sum; for ($i2 = 0; $i2 < $this->p; $i2++) $this->W[$i1][$i2] *= $sum; } /* 学習 */ for ($count = 0; $count < $this->max; $count++) { // 訓練例の選択 $k = intval(mt_rand() / mt_getrandmax() * $this->n); if ($k >= $this->n) $k = $this->n - 1; // 出力の計算 for ($i1 = 0; $i1 < $this->o; $i1++) { $s = 0.0; for ($i2 = 0; $i2 < $this->p; $i2++) $s += $this->W[$i1][$i2] * $this->E[$k][$i2]; if ($i1 == 0 || $s > $mx_v) { $mx = $i1; $mx_v = $s; } } // 重みの修正 $sum = 0.0; for ($i1 = 0; $i1 < $this->p; $i1++) $sum += $this->E[$k][$i1]; for ($i1 = 0; $i1 < $this->p; $i1++) $this->W[$mx][$i1] += $this->sig * ($this->E[$k][$i1] / $sum - $this->W[$mx][$i1]); } /* 出力 */ if ($pr == 0) $out = STDOUT; else $out = fopen($name, "w"); fwrite($out, "分類結果\n"); for ($i1 = 0; $i1 < $this->n; $i1++) { $str = ""; for ($i2 = 0; $i2 < $this->p; $i2++) $str = $str." ".$this->E[$i1][$i2]; $str = $str." Res "; for ($i2 = 0; $i2 < $this->o; $i2++) { $s = 0.0; for ($i3 = 0; $i3 < $this->p; $i3++) $s += $this->W[$i2][$i3] * $this->E[$i1][$i3]; if ($i2 == 0 || $s > $mx_v) { $mx = $i2; $mx_v = $s; } } fwrite($out, $str.($mx+1)."\n"); } } } /****************/ /* main program */ /****************/ if (count($argv) > 1) { // 基本データの入力 $st = fopen($argv[1], "r"); fscanf($st, "%*s %ld %*s %ld %*s %ld %*s %ld %*s %lf", $max, $p, $o, $n, $sig); fscanf($st, "%*s %s", $name); fclose($st); // ネットワークの定義 $net = new Competition($max, $n, $o, $p, $sig); $net->Input($name); // 学習と結果の出力 if (count($argv) == 2) $net->Learn(0); else $net->Learn(1, $argv[2]); } else exit("***error 入力データファイル名を指定して下さい\n"); /* ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 */ ?>
########################## # 競合学習 # coded by Y.Suganuma ########################## ############################# # Competitionクラスの定義 # coded by Y.Suganuma ############################# class Competition ######################### # コンストラクタ # max : 最大学習回数 # n : 訓練例の数 # o : 出力セルの数 # p : 入力セルの数 # sig : 重み修正係数 ######################### def initialize(max_i, n_i, o_i, p_i, sig_i) # 設定 @_max = max_i @_n = n_i @_o = o_i @_p = p_i @_sig = sig_i # 領域の確保 @_e = Array.new(@_n) # 訓練例 for i1 in 0 ...@_n @_e[i1] = Array.new(@_p) end @_w = Array.new(@_o) # 重み for i1 in 0 ...@_o @_w[i1] = Array.new(@_p) end end #*************************/ # 学習データの読み込み */ # name : ファイル名 */ #*************************/ def Input(name) f = open(name, "r") for i1 in 0 ... @_n s = f.gets().split(" ") for i2 in 0 ... @_p @_e[i1][i2] = Integer(s[i2]) end end f.close() end ################################# # 学習と結果の出力 # pr : =0 : 画面に出力 # =1 : ファイルに出力 # name : 出力ファイル名 ################################# def Learn(pr, name="") # 初期設定 mx_v = 0.0 mx = 0 for i1 in 0 ... @_o sum = 0.0 for i2 in 0 ... @_p @_w[i1][i2] = rand(0) sum += @_w[i1][i2] end sum = 1.0 / sum for i2 in 0 ... @_p @_w[i1][i2] *= sum end end # 学習 for count in 0 ... @_max # 訓練例の選択 k = Integer(rand(0) * @_n) if k >= @_n k = @_n - 1 end # 出力の計算 for i1 in 0 ... @_o s = 0.0 for i2 in 0 ... @_p s += @_w[i1][i2] * @_e[k][i2] end if i1 == 0 or s > mx_v mx = i1 mx_v = s end end # 重みの修正 sum = 0.0 for i1 in 0 ... @_p sum += @_e[k][i1] end for i1 in 0 ... @_p @_w[mx][i1] += @_sig * (@_e[k][i1] / sum - @_w[mx][i1]) end end # 出力 if pr == 0 out = $stdout else out = open(name, "w") end out.print("分類結果\n") for i1 in 0 ... @_n for i2 in 0 ... @_p out.print(" " + String(@_e[i1][i2])) end out.print(" Res ") for i2 in 0 ... @_o s = 0.0 for i3 in 0 ... @_p s += @_w[i2][i3] * @_e[i1][i3] end if i2 == 0 or s > mx_v mx = i2 mx_v = s end end out.print(" " + String(mx+1) + "\n") end end end if ARGV[0] != nil # 基本データの入力 s = gets().split(" ") max = Integer(s[1]) p = Integer(s[3]) o = Integer(s[5]) n = Integer(s[7]) sig = Float(s[9]) s = gets().split(" ") name = s[1] # ネットワークの定義 srand() net = Competition.new(max, n, o, p, sig) net.Input(name) # 学習と結果の出力 if ARGV[0] == nil net.Learn(0) else net.Learn(1, ARGV[0]) end else print("***error 入力ファイル名を指定して下さい\n") end =begin ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 =end
# -*- coding: UTF-8 -*- import numpy as np import sys from math import * from random import * ############################# # Competitionクラスの定義 # coded by Y.Suganuma ############################# class Competition : ######################### # コンストラクタ # max : 最大学習回数 # n : 訓練例の数 # o : 出力セルの数 # p : 入力セルの数 # sig : 重み修正係数 ######################### def __init__(self, max_i, n_i, o_i, p_i, sig_i) : # 設定 self.max = max_i self.n = n_i self.o = o_i self.p = p_i self.sig = sig_i # 領域の確保 self.E = np.empty((self.n, self.p), np.int) # 訓練例 self.W = np.empty((self.o, self.p), np.float) # 重み #*************************/ # 学習データの読み込み */ # name : ファイル名 */ #*************************/ def Input(self, name) : f = open(name, "r") for i1 in range(0, self.n) : s = f.readline().split() for i2 in range(0, self.p) : self.E[i1][i2] = int(s[i2]) f.close() ################################# # 学習と結果の出力 # pr : =0 : 画面に出力 # =1 : ファイルに出力 # name : 出力ファイル名 ################################# def Learn(self, pr, name="") : # 初期設定 mx_v = 0.0 mx = 0 for i1 in range(0, self.o) : sum = 0.0 for i2 in range(0, self.p) : self.W[i1][i2] = random() sum += self.W[i1][i2] sum = 1.0 / sum for i2 in range(0, self.p) : self.W[i1][i2] *= sum # 学習 for count in range(0, self.max) : # 訓練例の選択 k = int(random() * self.n) if k >= self.n : k = self.n - 1 # 出力の計算 for i1 in range(0, self.o) : s = 0.0 for i2 in range(0, self.p) : s += self.W[i1][i2] * self.E[k][i2] if i1 == 0 or s > mx_v : mx = i1 mx_v = s # 重みの修正 sum = 0.0 for i1 in range(0, self.p) : sum += self.E[k][i1] for i1 in range(0, self.p) : self.W[mx][i1] += self.sig * (self.E[k][i1] / sum - self.W[mx][i1]) # 出力 if pr == 0 : out = sys.stdout else : out = open(name, "w") out.write("分類結果\n") for i1 in range(0, self.n) : for i2 in range(0, self.p) : out.write(" " + str(self.E[i1][i2])) out.write(" Res ") for i2 in range(0, self.o) : s = 0.0 for i3 in range(0, self.p) : s += self.W[i2][i3] * self.E[i1][i3] if i2 == 0 or s > mx_v : mx = i2 mx_v = s out.write(" " + str(mx+1) + "\n") ########################## # 競合学習 # coded by Y.Suganuma ########################## if len(sys.argv) > 1 : # 基本データの入力 f = open(sys.argv[1], "r") s = f.readline().split() max = int(s[1]) p = int(s[3]) o = int(s[5]) n = int(s[7]) sig = float(s[9]) s = f.readline().split() name = s[1] f.close() # ネットワークの定義 seed() net = Competition(max, n, o, p, sig) net.Input(name) # 学習と結果の出力 if len(sys.argv) == 2 : net.Learn(0) else : net.Learn(1, sys.argv[2]) else : print("***error 入力ファイル名を指定して下さい") """ ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 """
/****************************/ /* 競合学習 */ /* coded by Y.Suganuma */ /****************************/ using System; using System.IO; class Program { /****************/ /* main program */ /****************/ static void Main(String[] args) { if (args.Length > 0) { char[] charSep = new char[] {' '}; // 基本データの入力 String[] lines = File.ReadAllLines(args[0]); String[] str = lines[0].Split(charSep, StringSplitOptions.RemoveEmptyEntries); int max = int.Parse(str[1]); int p = int.Parse(str[3]); int o = int.Parse(str[5]); int n = int.Parse(str[7]); double sig = double.Parse(str[9]); str = lines[1].Split(charSep, StringSplitOptions.RemoveEmptyEntries); String name = str[1]; // ネットワークの定義 Competition net = new Competition (max, n, o, p, sig); net.input(name); // 学習と結果の出力 if (args.Length == 1) net.learn(0, ""); else net.learn(1, args[1]); } // エラー else { Console.WriteLine("***error 入力データファイル名を指定して下さい"); Environment.Exit(1); } } } /***************************/ /* Competitionクラスの定義 */ /***************************/ class Competition { int max; // 最大学習回数 int n; // 訓練例の数 int o; // 出力セルの数 int p; // 入力セルの数 int[][] E; // 訓練例 double[][] W; // 重み double sig; // 重み修正係数 Random rn; // 乱数 /******************/ /* コンストラクタ */ /******************/ public Competition (int max_i, int n_i, int o_i, int p_i, double sig_i) { // // 設定 // max = max_i; n = n_i; o = o_i; p = p_i; sig = sig_i; rn = new Random(); // 乱数の初期設定 // // 領域の確保 // E = new int [n][]; for (int i1 = 0; i1 < n; i1++) E[i1] = new int [p]; W = new double [o][]; for (int i1 = 0; i1 < o; i1++) W[i1] = new double [p]; } /**************************/ /* 学習データの読み込み */ /* name : ファイル名 */ /**************************/ public void input (String name) { char[] charSep = new char[] {' '}; String[] lines = File.ReadAllLines(name); for (int i1 = 0; i1 < n; i1++) { String[] str = lines[i1].Split(charSep, StringSplitOptions.RemoveEmptyEntries); for (int i2 = 0; i2 < p; i2++) E[i1][i2] = int.Parse(str[i2]); } } /*********************************/ /* 学習と結果の出力 */ /* pr : =0 : 画面に出力 */ /* =1 : ファイルに出力 */ /* name : 出力ファイル名 */ /*********************************/ public void learn(int pr, String name) { double mx_v = 0.0; int count, mx = 0; // // 初期設定 // for (int i1 = 0; i1 < o; i1++) { double sum = 0.0; for (int i2 = 0; i2 < p; i2++) { W[i1][i2] = rn.NextDouble(); sum += W[i1][i2]; } sum = 1.0 / sum; for (int i2 = 0; i2 < p; i2++) W[i1][i2] *= sum; } // // 学習 // for (count = 0; count < max; count++) { // 訓練例の選択 int k = (int)(rn.NextDouble() * n); if (k >= n) k = n - 1; // 出力の計算 for (int i1 = 0; i1 < o; i1++) { double s = 0.0; for (int i2 = 0; i2 < p; i2++) s += W[i1][i2] * E[k][i2]; if (i1 == 0 || s > mx_v) { mx = i1; mx_v = s; } } // 重みの修正 double sum = 0.0; for (int i1 = 0; i1 < p; i1++) sum += E[k][i1]; for (int i1 = 0; i1 < p; i1++) W[mx][i1] += sig * (E[k][i1] / sum - W[mx][i1]); } // // 出力 // if (pr == 0) { Console.WriteLine("分類結果"); for (int i1 = 0; i1 < n; i1++) { for (int i2 = 0; i2 < p; i2++) Console.Write(" " + E[i1][i2]); Console.Write(" Res "); for (int i2 = 0; i2 < o; i2++) { double s = 0.0; for (int i3 = 0; i3 < p; i3++) s += W[i2][i3] * E[i1][i3]; if (i2 == 0 || s > mx_v) { mx = i2; mx_v = s; } } Console.WriteLine((mx+1)); } } else { StreamWriter OUT = new StreamWriter(name, true); OUT.WriteLine("分類結果"); for (int i1 = 0; i1 < n; i1++) { for (int i2 = 0; i2 < p; i2++) OUT.Write(" " + E[i1][i2]); OUT.Write(" Res "); for (int i2 = 0; i2 < o; i2++) { double s = 0.0; for (int i3 = 0; i3 < p; i3++) s += W[i2][i3] * E[i1][i3]; if (i2 == 0 || s > mx_v) { mx = i2; mx_v = s; } } OUT.WriteLine((mx+1)); } OUT.Close(); } } } /* ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 */
'**************************' ' 競合学習 ' ' coded by Y.Suganuma ' '**************************' Imports System.IO Imports System.Text.RegularExpressions Module Test Sub Main(args() As String) If args.Length > 0 ' 基本データの入力 Dim inp As StreamReader = New StreamReader(args(0)) Dim MS As Regex = New Regex("\s+") Dim str() As String = MS.Split(inp.ReadLine().Trim()) Dim max As Integer = Integer.Parse(str(1)) Dim p As Integer = Integer.Parse(str(3)) Dim o As Integer = Integer.Parse(str(5)) Dim n As Integer = Integer.Parse(str(7)) Dim sig As Double = Double.Parse(str(9)) str = MS.Split(inp.ReadLine().Trim()) Dim name As String = str(1) inp.Close() ' ネットワークの定義 Dim net As Competition = new Competition (max, n, o, p, sig) net.input(name) ' 学習と結果の出力 If args.Length = 1 net.learn(0, "") Else net.learn(1, args(1)) End If ' エラー Else Console.WriteLine("***error 入力データファイル名を指定して下さい") Environment.Exit(1) End If End Sub '*************************' ' Competitionクラスの定義 ' '*************************' Class Competition Private max As Integer ' 最大学習回数 Private n As Integer ' 訓練例の数 Private o As Integer ' 出力セルの数 Private p As Integer ' 入力セルの数 Private E(,) As Integer ' 訓練例 Private W(,) As Double ' 重み Private sig As Double ' 重み修正係数 Private rn As Random ' 乱数 '****************' ' コンストラクタ ' '****************' Public Sub New(max_i As Integer, n_i As Integer, o_i As Integer, p_i As Integer, sig_i As Double) ' ' 設定 ' max = max_i n = n_i o = o_i p = p_i sig = sig_i rn = new Random() ' 乱数の初期設定 ' ' 領域の確保 ' ReDim E(n,p) ReDim W(o,p) End Sub '************************' ' 学習データの読み込み ' ' name : ファイル名 ' '************************' Public Sub input (name As String) Dim inp As StreamReader = New StreamReader(name) Dim MS As Regex = New Regex("\s+") For i1 As Integer = 0 To n-1 Dim str() As String = MS.Split(inp.ReadLine().Trim()) For i2 As Integer = 0 To p-1 E(i1,i2) = Integer.Parse(str(i2)) Next Next inp.Close() End Sub '*******************************' ' 学習と結果の出力 ' ' pr : =0 : 画面に出力 ' ' =1 : ファイルに出力 ' ' name : 出力ファイル名 ' '*******************************' Public Sub learn(pr As Integer, name As String) Dim count As Integer Dim mx As Integer = 0 Dim mx_v As Double = 0.0 ' ' 初期設定 ' For i1 As Integer = 0 To o-1 Dim sum As Double = 0.0 For i2 As Integer = 0 To p-1 W(i1,i2) = rn.NextDouble() sum += W(i1,i2) Next sum = 1.0 / sum For i2 As Integer = 0 To p-1 W(i1,i2) *= sum Next Next ' ' 学習 ' For count = 0 To max-1 ' 訓練例の選択 Dim k As Integer = Math.Floor(rn.NextDouble() * n) If k >= n k = n - 1 End If ' 出力の計算 For i1 As Integer = 0 To o-1 Dim s As Double = 0.0 For i2 As Integer = 0 To p-1 s += W(i1,i2) * E(k,i2) Next If i1 = 0 or s > mx_v mx = i1 mx_v = s End If Next ' 重みの修正 Dim sum As Double = 0.0 For i1 As Integer = 0 To p-1 sum += E(k,i1) Next For i1 As Integer = 0 To p-1 W(mx,i1) += sig * (E(k,i1) / sum - W(mx,i1)) Next Next ' ' 出力 ' If pr = 0 Console.WriteLine("分類結果") For i1 As Integer = 0 To n-1 For i2 As Integer = 0 To p-1 Console.Write(" " & E(i1,i2)) Next Console.Write(" Res ") For i2 As Integer = 0 To o-1 Dim s As Double = 0.0 For i3 As Integer = 0 To p-1 s += W(i2,i3) * E(i1,i3) Next If i2 = 0 or s > mx_v mx = i2 mx_v = s End If Next Console.WriteLine((mx+1)) Next Else Dim OUT As StreamWriter = new StreamWriter(name) OUT.WriteLine("分類結果") For i1 As Integer = 0 To n-1 For i2 As Integer = 0 To p-1 OUT.Write(" " & E(i1,i2)) Next OUT.Write(" Res ") For i2 As Integer = 0 To o-1 Dim s As Double = 0.0 For i3 As Integer = 0 To p-1 s += W(i2,i3) * E(i1,i3) Next If i2 = 0 or s > mx_v mx = i2 mx_v = s End If Next OUT.WriteLine((mx+1)) Next OUT.Close() End If End Sub End Class End Module /* ------------------------入力ファイル-------------- 最大試行回数 1000 入力セルの数 9 出力セルの数 3 訓練例の数 9 係数(0~1) 0.1 入力データファイル pat.dat ------------------------pat.dat------------------- 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 */
情報学部 | 菅沼ホーム | 目次 | 索引 |