| 情報学部 | 菅沼ホーム | 目次 | 索引 |
/***********************************/
/* パーセプトロン学習 */
/* (Pocket Algorith with Ratcet) */
/* coded by Y.Suganuma */
/***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "MT.h"
/**************************/
/* Perceptronクラスの定義 */
/**************************/
class Perceptron {
long max; // 最大学習回数
long n; // 訓練例の数
long p; // 入力セルの数
long *W_p; // 重み(ポケット)
long *W; // 重み
long **E; // 訓練例
long *C; // 各訓練例に対する正しい出力
public:
Perceptron(long, long, long, long);
~Perceptron();
long Bunrui();
void Input(char *);
void Learn(int, char *name = "");
long Pocket(long *);
};
/******************/
/* コンストラクタ */
/******************/
Perceptron::Perceptron(long max_i, long n_i, long p_i, long seed)
{
long i1;
/*
設定
*/
max = max_i;
n = n_i;
p = p_i;
init_genrand(seed);
/*
領域の確保
*/
E = new long * [n];
for (i1 = 0; i1 < n; i1++)
E[i1] = new long [p+1];
W_p = new long [p+1];
W = new long [p+1];
C = new long [n];
}
/****************/
/* デストラクタ */
/****************/
Perceptron::~Perceptron()
{
int i1;
for (i1 = 0; i1 < n; i1++)
delete [] E[i1];
delete [] E;
delete [] W_p;
delete [] W;
delete [] C;
}
/******************************************/
/* 訓練例の分類 */
/* return : 正しく分類した訓練例の数 */
/******************************************/
long Perceptron::Bunrui()
{
long i1, i2, num = 0, s;
for (i1 = 0; i1 < n; i1++) {
s = 0;
for (i2 = 0; i2 <= p; i2++)
s += W[i2] * E[i1][i2];
if ((s > 0 && C[i1] > 0) || (s < 0 && C[i1] < 0))
num++;
}
return num;
}
/**************************/
/* 学習データの読み込み */
/* name : ファイル名 */
/**************************/
void Perceptron::Input(char *name)
{
long i1, i2;
FILE *st;
st = fopen(name, "r");
fscanf(st, "%*s");
for (i1 = 0; i1 < n; i1++) {
E[i1][0] = 1;
for (i2 = 1; i2 <= p; i2++)
fscanf(st, "%ld", &E[i1][i2]);
fscanf(st, "%ld", &C[i1]);
}
fclose(st);
}
/*********************************/
/* 学習と結果の出力 */
/* pr : =0 : 画面に出力 */
/* =1 : ファイルに出力 */
/* name : 出力ファイル名 */
/*********************************/
void Perceptron::Learn(int pr, char *name)
{
long i1, i2, n_tri, num, s;
FILE *out;
n_tri = Pocket(&num);
if (pr == 0)
out = stdout;
else
out = fopen(name, "w");
fprintf(out, "重み\n");
for (i1 = 0; i1 <= p; i1++)
fprintf(out, "%5ld", W_p[i1]);
fprintf(out, "\n");
fprintf(out,"分類結果\n");
for (i1 = 0; i1 < n; i1++) {
s = 0;
for (i2 = 0; i2 <= p; i2++)
s += E[i1][i2] * W_p[i2];
if (s > 0)
s = 1;
else
s = (s < 0) ? -1 : 0;
for (i2 = 1; i2 <= p; i2++)
fprintf(out, "%2ld", E[i1][i2]);
fprintf(out, " Cor %2ld Res %2ld\n", C[i1], s);
}
if (n == num)
printf(" !!すべてを分類(試行回数:%ld)\n", n_tri);
else
printf(" !!%ld 個を分類\n", num);
}
/********************************************/
/* Pocket Algorith with Ratcet */
/* num_p : 正しく分類した訓練例の数 */
/* return : =0 : 最大学習回数 */
/* >0 : すべてを分類(回数) */
/********************************************/
long Perceptron::Pocket(long *num_p)
{
long count = 0, i1, k, num, run = 0, run_p = 0, s, sw = -1;
/*
初期設定
*/
*num_p = 0;
for (i1 = 0; i1 <= p; i1++)
W[i1] = 0;
/*
実行
*/
while (sw < 0) {
count++;
if (count > max)
sw = 0;
else {
// 訓練例の選択
k = (long)(genrand_real3() * n);
if (k >= n)
k = n - 1;
// 出力の計算
s = 0;
for (i1 = 0; i1 <= p; i1++)
s += W[i1] * E[k][i1];
// 正しい分類
if ((s > 0 && C[k] > 0) || (s < 0 && C[k] < 0)) {
run++;
if (run > run_p) {
num = Bunrui();
if (num > *num_p) {
*num_p = num;
run_p = run;
for (i1 = 0; i1 <= p; i1++)
W_p[i1] = W[i1];
if (num == n)
sw = count;
}
}
}
// 誤った分類
else {
run = 0;
for (i1 = 0; i1 <= p; i1++)
W[i1] += C[k] * E[k][i1];
}
}
}
return sw;
}
/****************/
/* main program */
/****************/
int main(int argc, char *argv[])
{
long max, n, p;
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",
&max, &p, &n);
fscanf(st, "%*s %s", name);
fclose(st);
// ネットワークの定義
Perceptron net(max, n, p, seed);
net.Input(name);
// 学習と結果の出力
if (argc == 2)
net.Learn(0);
else
net.Learn(1, argv[2]);
}
else {
printf("***error 入力データファイル名を指定して下さい\n");
exit(1);
}
return 0;
}
/*
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
//---------------------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
*/
/***********************************/
/* パーセプトロン学習 */
/* (Pocket Algorith with Ratcet) */
/* 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
{
int max, n, 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();
n = Integer.parseInt(str.nextToken());
str = new StringTokenizer(in.readLine(), " ");
str.nextToken();
name = str.nextToken();
in.close();
// ネットワークの定義
Perceptron net = new Perceptron (max, n, p);
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);
}
}
}
/**************************/
/* Perceptronクラスの定義 */
/**************************/
class Perceptron {
private int max; // 最大学習回数
private int n; // 訓練例の数
private int p; // 入力セルの数
private int W_p[]; // 重み(ポケット)
private int W[]; // 重み
private int E[][]; // 訓練例
private int C[]; // 各訓練例に対する正しい出力
private Random rn; // 乱数
/******************/
/* コンストラクタ */
/******************/
Perceptron(int max_i, int n_i, int p_i)
{
/*
設定
*/
max = max_i;
n = n_i;
p = p_i;
rn = new Random(); // 乱数の初期設定
/*
領域の確保
*/
E = new int [n][p+1];
W_p = new int [p+1];
W = new int [p+1];
C = new int [n];
}
/******************************************/
/* 訓練例の分類 */
/* return : 正しく分類した訓練例の数 */
/******************************************/
int bunrui()
{
int i1, i2, num = 0, s;
for (i1 = 0; i1 < n; i1++) {
s = 0;
for (i2 = 0; i2 <= p; i2++)
s += W[i2] * E[i1][i2];
if ((s > 0 && C[i1] > 0) || (s < 0 && C[i1] < 0))
num++;
}
return num;
}
/**************************/
/* 学習データの読み込み */
/* name : ファイル名 */
/**************************/
void input (String name) throws IOException, FileNotFoundException
{
int i1, i2;
StringTokenizer str;
BufferedReader st = new BufferedReader(new FileReader(name));
st.readLine();
for (i1 = 0; i1 < n; i1++) {
E[i1][0] = 1;
str = new StringTokenizer(st.readLine(), " ");
for (i2 = 1; i2 <= p; i2++)
E[i1][i2] = Integer.parseInt(str.nextToken());
C[i1] = Integer.parseInt(str.nextToken());
}
st.close();
}
/*********************************/
/* 学習と結果の出力 */
/* pr : =0 : 画面に出力 */
/* =1 : ファイルに出力 */
/* name : 出力ファイル名 */
/*********************************/
void learn(int pr, String name) throws FileNotFoundException
{
int i1, i2, n_tri, s;
int num[] = new int [1];
// 学習
n_tri = pocket(num);
// 結果の出力
if (pr == 0) {
System.out.print("重み\n");
for (i1 = 0; i1 <= p; i1++)
System.out.print(" " + W_p[i1]);
System.out.println();
System.out.print("分類結果\n");
for (i1 = 0; i1 < n; i1++) {
s = 0;
for (i2 = 0; i2 <= p; i2++)
s += E[i1][i2] * W_p[i2];
if (s > 0)
s = 1;
else
s = (s < 0) ? -1 : 0;
for (i2 = 1; i2 <= p; i2++)
System.out.print(" " + E[i1][i2]);
System.out.println(" Cor " + C[i1] + " Res " + s);
}
}
else {
PrintStream out = new PrintStream(new FileOutputStream(name));
out.print("重み\n");
for (i1 = 0; i1 <= p; i1++)
out.print(" " + W_p[i1]);
out.println();
out.print("分類結果\n");
for (i1 = 0; i1 < n; i1++) {
s = 0;
for (i2 = 0; i2 <= p; i2++)
s += E[i1][i2] * W_p[i2];
if (s > 0)
s = 1;
else
s = (s < 0) ? -1 : 0;
for (i2 = 1; i2 <= p; i2++)
out.print(" " + E[i1][i2]);
out.println(" Cor " + C[i1] + " Res " + s);
}
out.close();
}
if (n == num[0])
System.out.print(" !!すべてを分類(試行回数:" + n_tri + ")\n");
else
System.out.print(" !!" + num[0] + " 個を分類\n");
}
/********************************************/
/* Pocket Algorith with Ratcet */
/* num_p : 正しく分類した訓練例の数 */
/* return : =0 : 最大学習回数 */
/* >0 : すべてを分類(回数) */
/********************************************/
int pocket(int num_p[])
{
int count = 0, i1, k, num, run = 0, run_p = 0, s, sw = -1;
/*
初期設定
*/
num_p[0] = 0;
for (i1 = 0; i1 <= p; i1++)
W[i1] = 0;
/*
実行
*/
while (sw < 0) {
count++;
if (count > max)
sw = 0;
else {
// 訓練例の選択
k = (int)(rn.nextDouble() * n);
if (k >= n)
k = n - 1;
// 出力の計算
s = 0;
for (i1 = 0; i1 <= p; i1++)
s += W[i1] * E[k][i1];
// 正しい分類
if ((s > 0 && C[k] > 0) || (s < 0 && C[k] < 0)) {
run++;
if (run > run_p) {
num = bunrui();
if (num > num_p[0]) {
num_p[0] = num;
run_p = run;
for (i1 = 0; i1 <= p; i1++)
W_p[i1] = W[i1];
if (num == n)
sw = count;
}
}
}
// 誤った分類
else {
run = 0;
for (i1 = 0; i1 <= p; i1++)
W[i1] += C[k] * E[k][i1];
}
}
}
return sw;
}
}
/*
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
*/
<!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 n = parseInt(document.getElementById("n").value);
// ネットワークの定義
net = new Perceptron (max, n, p);
net.input();
// 学習と結果の出力
net.learn();
document.getElementById("result").value = res;
}
/***************************/
/* Perceptron オブジェクト */
/***************************/
function Perceptron(max_i, n_i, p_i)
{
//
// 設定
//
this.max = max_i; // 最大学習回数
this.n = n_i; // 訓練例の数
this.p = p_i; // 入力セルの数
//
// 領域の確保
//
this.E = new Array(this.n); // 訓練例
for (let i1 = 0; i1 < this.n; i1++)
this.E[i1] = new Array(this.p+1);
this.W_p = new Array(this.p+1); // 重み(ポケット)
this.W = new Array(this.p+1); // 重み
this.C = new Array(this.n); // 各訓練例に対する正しい出力
}
/******************************************/
/* 訓練例の分類 */
/* return : 正しく分類した訓練例の数 */
/******************************************/
Perceptron.prototype.bunrui = function()
{
let num = 0;
for (let i1 = 0; i1 < net.n; i1++) {
let s = 0;
for (let i2 = 0; i2 <= net.p; i2++)
s += net.W[i2] * net.E[i1][i2];
if ((s > 0 && net.C[i1] > 0) || (s < 0 && net.C[i1] < 0))
num++;
}
return num;
}
/************************/
/* 学習データの読み込み */
/************************/
Perceptron.prototype.input = function()
{
let lines = (document.getElementById("data").value).split('\n');
for (let i1 = 0; i1 < net.n; i1++) {
let str = lines[1+i1].split(' ').filter(function(e){return e.length > 0;});
net.E[i1][0] = 1;
for (let i2 = 1; i2 <= net.p; i2++)
net.E[i1][i2] = parseInt(str[i2-1]);
net.C[i1] = parseInt(str[net.p]);
}
}
/********************/
/* 学習と結果の出力 */
/********************/
Perceptron.prototype.learn = function()
{
// 学習
let num = new Array(1);
let n_tri = net.pocket(num);
// 結果の出力
res += "重み\n";
for (let i1 = 0; i1 <= net.p; i1++)
res += (" " + net.W_p[i1]);
res += "\n";
res += "分類結果\n";
for (let i1 = 0; i1 < net.n; i1++) {
let s = 0;
for (let i2 = 0; i2 <= net.p; i2++)
s += net.E[i1][i2] * net.W_p[i2];
if (s > 0)
s = 1;
else
s = (s < 0) ? -1 : 0;
for (let i2 = 1; i2 <= net.p; i2++)
res += (" " + net.E[i1][i2]);
res += (" Cor " + net.C[i1] + " Res " + s + "\n");
}
if (net.n == num[0])
res += (" !!すべてを分類(試行回数:" + n_tri + ")\n");
else
res += (" !!" + num[0] + " 個を分類\n");
}
/********************************************/
/* Pocket Algorith with Ratcet */
/* num_p : 正しく分類した訓練例の数 */
/* return : =0 : 最大学習回数 */
/* >0 : すべてを分類(回数) */
/********************************************/
Perceptron.prototype.pocket = function(num_p)
{
//
// 初期設定
//
num_p[0] = 0;
for (let i1 = 0; i1 <= net.p; i1++)
net.W[i1] = 0;
//
// 実行
//
let count = 0, k, run = 0, run_p = 0, sw = -1;
while (sw < 0) {
count++;
if (count > net.max)
sw = 0;
else {
// 訓練例の選択
k = Math.floor(Math.random() * net.n);
if (k >= net.n)
k = net.n - 1;
// 出力の計算
let s = 0;
for (let i1 = 0; i1 <= net.p; i1++)
s += net.W[i1] * net.E[k][i1];
// 正しい分類
if ((s > 0 && net.C[k] > 0) || (s < 0 && net.C[k] < 0)) {
run++;
if (run > run_p) {
let num = net.bunrui();
if (num > num_p[0]) {
num_p[0] = num;
run_p = run;
for (let i1 = 0; i1 <= net.p; i1++)
net.W_p[i1] = net.W[i1];
if (num == net.n)
sw = count;
}
}
}
// 誤った分類
else {
run = 0;
for (let i1 = 0; i1 <= net.p; i1++)
net.W[i1] += net.C[k] * net.E[k][i1];
}
}
}
return sw;
}
</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="100">
入力セル数:<INPUT ID="p" STYLE="font-size: 100%" TYPE="text" SIZE="1" VALUE="2">
訓練例数:<INPUT ID="n" STYLE="font-size: 100%" TYPE="text" SIZE="1" VALUE="4">
<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">
OR演算の訓練例.各行の最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
</TEXTAREA>
</DIV>
</DIV>
</BODY>
</HTML>
<?php
/***********************************/
/* パーセプトロン学習 */
/* (Pocket Algorith with Ratcet) */
/* coded by Y.Suganuma */
/***********************************/
/**************************/
/* Perceptronクラスの定義 */
/**************************/
class Perceptron {
private $max; // 最大学習回数
private $n; // 訓練例の数
private $p; // 入力セルの数
private $W_p; // 重み(ポケット)
private $W; // 重み
private $E; // 訓練例
private $C; // 各訓練例に対する正しい出力
/******************/
/* コンストラクタ */
/******************/
function Perceptron($max_i, $n_i, $p_i)
{
/*
設定
*/
$this->max = $max_i;
$this->n = $n_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+1);
$this->W_p = array($this->p+1);
$this->W = array($this->p+1);
$this->C = array($this->n);
}
/******************************************/
/* 訓練例の分類 */
/* return : 正しく分類した訓練例の数 */
/******************************************/
function Bunrui()
{
$num = 0;
for ($i1 = 0; $i1 < $this->n; $i1++) {
$s = 0;
for ($i2 = 0; $i2 <= $this->p; $i2++)
$s += $this->W[$i2] * $this->E[$i1][$i2];
if (($s > 0 && $this->C[$i1] > 0) || ($s < 0 && $this->C[$i1] < 0))
$num++;
}
return $num;
}
/**************************/
/* 学習データの読み込み */
/* name : ファイル名 */
/**************************/
function Input($name)
{
$st = fopen($name, "r");
fgets($st);
for ($i1 = 0; $i1 < $this->n; $i1++) {
$this->E[$i1][0] = 1;
$str = trim(fgets($st));
$this->E[$i1][1] = intval(strtok($str, " "));
for ($i2 = 2; $i2 <= $this->p; $i2++)
$this->E[$i1][$i2] = intval(strtok(" "));
$this->C[$i1] = intval(strtok(" "));
}
fclose($st);
}
/*********************************/
/* 学習と結果の出力 */
/* pr : =0 : 画面に出力 */
/* =1 : ファイルに出力 */
/* name : 出力ファイル名 */
/*********************************/
function Learn($pr, $name = "STDOUT")
{
$n_tri = $this->Pocket($num);
if ($pr == 0)
$out = STDOUT;
else
$out = fopen($name, "wb");
fwrite($out, "重み\n");
$str = "";
for ($i1 = 0; $i1 <= $this->p; $i1++)
$str = $str.$this->W_p[$i1]." ";
fwrite($out, $str."\n");
fwrite($out,"分類結果\n");
for ($i1 = 0; $i1 < $this->n; $i1++) {
$s = 0;
for ($i2 = 0; $i2 <= $this->p; $i2++)
$s += $this->E[$i1][$i2] * $this->W_p[$i2];
if ($s > 0)
$s = 1;
else
$s = ($s < 0) ? -1 : 0;
$str = "";
for ($i2 = 1; $i2 <= $this->p; $i2++)
$str = $str.$this->E[$i1][$i2]." ";
$str = $str."Cor ".$this->C[$i1]." Res ".$s;
fwrite($out, $str."\n");
}
if ($this->n == $num)
printf(" !!すべてを分類(試行回数:%ld)\n", $n_tri);
else
printf(" !!%ld 個を分類\n", $num);
}
/********************************************/
/* Pocket Algorith with Ratcet */
/* num_p : 正しく分類した訓練例の数 */
/* return : =0 : 最大学習回数 */
/* >0 : すべてを分類(回数) */
/********************************************/
function Pocket(&$num_p)
{
/*
初期設定
*/
$count = 0;
$run = 0;
$run_p = 0;
$sw = -1;
$num_p = 0;
for ($i1 = 0; $i1 <= $this->p; $i1++)
$this->W[$i1] = 0;
/*
実行
*/
while ($sw < 0) {
$count++;
if ($count > $this->max)
$sw = 0;
else {
// 訓練例の選択
$k = intval(mt_rand() / mt_getrandmax() * $this->n);
if ($k >= $this->n)
$k = $this->n - 1;
// 出力の計算
$s = 0;
for ($i1 = 0; $i1 <= $this->p; $i1++)
$s += $this->W[$i1] * $this->E[$k][$i1];
// 正しい分類
if (($s > 0 && $this->C[$k] > 0) || ($s < 0 && $this->C[$k] < 0)) {
$run++;
if ($run > $run_p) {
$num = $this->Bunrui();
if ($num > $num_p) {
$num_p = $num;
$run_p = $run;
for ($i1 = 0; $i1 <= $this->p; $i1++)
$this->W_p[$i1] = $this->W[$i1];
if ($num == $this->n)
$sw = $count;
}
}
}
// 誤った分類
else {
$run = 0;
for ($i1 = 0; $i1 <= $this->p; $i1++)
$this->W[$i1] += $this->C[$k] * $this->E[$k][$i1];
}
}
}
return $sw;
}
}
/****************/
/* main program */
/****************/
if (count($argv) > 1) {
// 基本データの入力
$st = fopen($argv[1], "rb");
fscanf($st, "%*s %ld %*s %ld %*s %ld", $max, $p, $n);
fscanf($st, "%*s %s", $name);
fclose($st);
// ネットワークの定義
$net = new Perceptron($max, $n, $p);
$net->Input($name);
// 学習と結果の出力
if (count($argv) == 2)
$net->Learn(0);
else
$net->Learn(1, $argv[2]);
}
else
exit("***error 入力データファイル名を指定して下さい\n");
/*
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
*/
?>
####################################
# パーセプトロン学習
# (Pocket Algorith with Ratcet)
# coded by Y.Suganuma
####################################
###########################
# Perceptronクラスの定義
# coded by Y.Suganuma
###########################
class Perceptron
#########################
# コンストラクタ
# max : 最大学習回数
# n : 訓練例の数
# p : 入力セルの数
#########################
def initialize(max_i, n_i, p_i)
# 設定
@_max = max_i
@_n = n_i
@_p = p_i
# 領域の確保
@_E = Array.new(@_n) # 訓練例
for i1 in 0 ... @_n
@_E[i1] = Array.new(@_p+1)
end
@_W_p = Array.new(@_p+1) # 重み(ポケット)
@_W = Array.new(@_p+1) # 重み
@_C = Array.new(@_n) # 各訓練例に対する正しい出力
end
#########################################
# 訓練例の分類
# return : 正しく分類した訓練例の数
#########################################
def Bunrui()
num = 0
for i1 in 0 ... @_n
s = 0
for i2 in 0 ... @_p+1
s += @_W[i2] * @_E[i1][i2]
end
if (s > 0 and @_C[i1] > 0) or (s < 0 and @_C[i1] < 0)
num += 1
end
end
return num
end
##########################
# 学習データの読み込み
# name : ファイル名
##########################
def Input(name)
f = open(name, "r")
f.gets()
for i1 in 0 ... @_n
@_E[i1][0] = 1
s = f.gets().split(" ")
for i2 in 1 ... @_p+1
@_E[i1][i2] = Integer(s[i2-1])
end
@_C[i1] = Integer(s[@_p])
end
f.close()
end
#################################
# 学習と結果の出力
# pr : =0 : 画面に出力
# =1 : ファイルに出力
# name : 出力ファイル名
#################################
def Learn(pr, name="")
num = Array.new(1)
n_tri = Pocket(num)
if pr == 0
out = $stdout
else
out = open(name, "w")
end
out.print("重み\n")
for i1 in 0 ... @_p+1
out.print(" " + String(@_W_p[i1]))
end
out.print("\n")
out.print("分類結果\n")
for i1 in 0 ... @_n
s = 0
for i2 in 0 ... @_p+1
s += @_E[i1][i2] * @_W_p[i2]
end
if s > 0
s = 1
else
if s < 0
s = -1
else
s = 0
end
end
for i2 in 1 ... @_p+1
out.print(" " + String(@_E[i1][i2]))
end
out.print(" Cor " + String(@_C[i1]) + " Res " + String(s) + "\n")
end
if @_n == num[0]
print(" !!すべてを分類(試行回数:" + String(n_tri) + ")\n")
else
print(" !!" + String(num[0]) + " 個を分類\n")
end
end
############################################
# Pocket Algorith with Ratcet
# num_p : 正しく分類した訓練例の数
# return : =0 : 最大学習回数
# >0 : すべてを分類(回数)
############################################
def Pocket(num_p)
# 初期設定
count = 0
run = 0
run_p = 0
sw = -1
num_p[0] = 0
for i1 in 0 ... @_p+1
@_W[i1] = 0
end
# 実行
while sw < 0
count += 1
if count > @_max
sw = 0
else
# 訓練例の選択
k = Integer(rand(0) * @_n)
if k >= @_n
k = @_n - 1
end
# 出力の計算
s = 0
for i1 in 0 ... @_p+1
s += @_W[i1] * @_E[k][i1]
end
# 正しい分類
if (s > 0 and @_C[k] > 0) or (s < 0 and @_C[k] < 0)
run += 1
if run > run_p
num = Bunrui()
if num > num_p[0]
num_p[0] = num
run_p = run
for i1 in 0 ... @_p+1
@_W_p[i1] = @_W[i1]
end
if num == @_n
sw = count
end
end
end
# 誤った分類
else
run = 0
for i1 in 0 ... @_p+1
@_W[i1] += @_C[k] * @_E[k][i1]
end
end
end
end
return sw
end
end
if ARGV[0] != nil
# 基本データの入力
s = gets().split(" ")
max = Integer(s[1])
p = Integer(s[3])
n = Integer(s[5])
s = gets().split(" ")
name = s[1]
# ネットワークの定義
srand()
net = Perceptron.new(max, n, p)
net.Input(name)
# 学習と結果の出力
if ARGV[0] == nil
net.Learn(0)
else
net.Learn(1, ARGV[0])
end
else
print("***error 入力ファイル名を指定して下さい\n")
end
=begin
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
=end
# -*- coding: UTF-8 -*-
import numpy as np
import sys
from math import *
from random import *
###########################
# Perceptronクラスの定義
# coded by Y.Suganuma
###########################
class Perceptron :
#########################
# コンストラクタ
# max : 最大学習回数
# n : 訓練例の数
# p : 入力セルの数
#########################
def __init__(self, max_i, n_i, p_i) :
# 設定
self.max = max_i
self.n = n_i
self.p = p_i
# 領域の確保
self.E = np.empty((self.n, self.p+1), np.int) # 訓練例
self.W_p = np.empty(self.p+1, np.int) # 重み(ポケット)
self.W = np.empty(self.p+1, np.int) # 重み
self.C = np.empty(self.n, np.int) # 各訓練例に対する正しい出力
#########################################
# 訓練例の分類
# return : 正しく分類した訓練例の数
#########################################
def Bunrui(self) :
num = 0
for i1 in range(0, self.n) :
s = 0
for i2 in range(0, self.p+1) :
s += self.W[i2] * self.E[i1][i2]
if (s > 0 and self.C[i1] > 0) or (s < 0 and self.C[i1] < 0) :
num += 1
return num
##########################
# 学習データの読み込み
# name : ファイル名
##########################
def Input(self, name) :
f = open(name, "r")
f.readline()
for i1 in range(0, self.n) :
self.E[i1][0] = 1
s = f.readline().split()
for i2 in range(1, self.p+1) :
self.E[i1][i2] = int(s[i2-1])
self.C[i1] = int(s[self.p])
f.close()
#################################
# 学習と結果の出力
# pr : =0 : 画面に出力
# =1 : ファイルに出力
# name : 出力ファイル名
#################################
def Learn(self, pr, name="") :
num = np.empty(1, np.int)
n_tri = self.Pocket(num)
if pr == 0 :
out = sys.stdout
else :
out = open(name, "w")
out.write("重み\n")
for i1 in range(0, self.p+1) :
out.write(" " + str(self.W_p[i1]))
out.write("\n")
out.write("分類結果\n")
for i1 in range(0, self.n) :
s = 0
for i2 in range(0, self.p+1) :
s += self.E[i1][i2] * self.W_p[i2]
if s > 0 :
s = 1
else :
if s < 0 :
s = -1
else :
s = 0
for i2 in range(1, self.p+1) :
out.write(" " + str(self.E[i1][i2]))
out.write(" Cor " + str(self.C[i1]) + " Res " + str(s) + "\n")
if self.n == num[0] :
print(" !!すべてを分類(試行回数:" + str(n_tri) + ")")
else :
print(" !!" + str(num[0]) + " 個を分類")
############################################
# Pocket Algorith with Ratcet
# num_p : 正しく分類した訓練例の数
# return : =0 : 最大学習回数
# >0 : すべてを分類(回数)
############################################
def Pocket(self, num_p) :
# 初期設定
count = 0
run = 0
run_p = 0
sw = -1
num_p[0] = 0
for i1 in range(0, self.p+1) :
self.W[i1] = 0
# 実行
while sw < 0 :
count += 1
if count > self.max :
sw = 0
else :
# 訓練例の選択
k = int(random() * self.n)
if k >= self.n :
k = self.n - 1
# 出力の計算
s = 0
for i1 in range(0, self.p+1) :
s += self.W[i1] * self.E[k][i1]
# 正しい分類
if (s > 0 and self.C[k] > 0) or (s < 0 and self.C[k] < 0) :
run += 1
if run > run_p :
num = self.Bunrui()
if num > num_p[0] :
num_p[0] = num
run_p = run
for i1 in range(0, self.p+1) :
self.W_p[i1] = self.W[i1]
if num == self.n :
sw = count
# 誤った分類
else :
run = 0
for i1 in range(0, self.p+1) :
self.W[i1] += self.C[k] * self.E[k][i1]
return sw
####################################
# パーセプトロン学習
# (Pocket Algorith with Ratcet)
# 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])
n = int(s[5])
s = f.readline().split()
name = s[1]
f.close()
# ネットワークの定義
seed()
net = Perceptron(max, n, p)
net.Input(name)
# 学習と結果の出力
if len(sys.argv) == 2 :
net.Learn(0)
else :
net.Learn(1, sys.argv[2])
else :
print("***error 入力ファイル名を指定して下さい")
"""
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
"""
/***********************************/
/* パーセプトロン学習 */
/* (Pocket Algorith with Ratcet) */
/* 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 n = int.Parse(str[5]);
str = lines[1].Split(charSep, StringSplitOptions.RemoveEmptyEntries);
String name = str[1];
// ネットワークの定義
Perceptron net = new Perceptron (max, n, p);
net.input(name);
// 学習と結果の出力
if (args.Length == 1)
net.learn(0, "");
else
net.learn(1, args[1]);
}
// エラー
else {
Console.WriteLine("***error 入力データファイル名を指定して下さい");
Environment.Exit(1);
}
}
}
/**************************/
/* Perceptronクラスの定義 */
/**************************/
class Perceptron {
int max; // 最大学習回数
int n; // 訓練例の数
int p; // 入力セルの数
int[] W_p; // 重み(ポケット)
int[] W; // 重み
int[][] E; // 訓練例
int[] C; // 各訓練例に対する正しい出力
Random rn; // 乱数
/******************/
/* コンストラクタ */
/******************/
public Perceptron(int max_i, int n_i, int p_i)
{
//
// 設定
//
max = max_i;
n = n_i;
p = p_i;
rn = new Random(); // 乱数の初期設定
//
// 領域の確保
//
E = new int [n][];
for (int i1 = 0; i1 < n; i1++)
E[i1] = new int [p+1];
W_p = new int [p+1];
W = new int [p+1];
C = new int [n];
}
/******************************************/
/* 訓練例の分類 */
/* return : 正しく分類した訓練例の数 */
/******************************************/
int bunrui()
{
int num = 0;
for (int i1 = 0; i1 < n; i1++) {
int s = 0;
for (int i2 = 0; i2 <= p; i2++)
s += W[i2] * E[i1][i2];
if ((s > 0 && C[i1] > 0) || (s < 0 && C[i1] < 0))
num++;
}
return num;
}
/**************************/
/* 学習データの読み込み */
/* 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[1+i1].Split(charSep, StringSplitOptions.RemoveEmptyEntries);
E[i1][0] = 1;
for (int i2 = 1; i2 <= p; i2++)
E[i1][i2] = int.Parse(str[i2-1]);
C[i1] = int.Parse(str[p]);
}
}
/*********************************/
/* 学習と結果の出力 */
/* pr : =0 : 画面に出力 */
/* =1 : ファイルに出力 */
/* name : 出力ファイル名 */
/*********************************/
public void learn(int pr, String name)
{
// 学習
int num = 0;
int n_tri = pocket(ref num);
// 結果の出力
if (pr == 0) {
Console.WriteLine("重み");
for (int i1 = 0; i1 <= p; i1++)
Console.Write(" " + W_p[i1]);
Console.WriteLine();
Console.WriteLine("分類結果");
for (int i1 = 0; i1 < n; i1++) {
int s = 0;
for (int i2 = 0; i2 <= p; i2++)
s += E[i1][i2] * W_p[i2];
if (s > 0)
s = 1;
else
s = (s < 0) ? -1 : 0;
for (int i2 = 1; i2 <= p; i2++)
Console.Write(" " + E[i1][i2]);
Console.WriteLine(" Cor " + C[i1] + " Res " + s);
}
}
else {
StreamWriter OUT = new StreamWriter(name, true);
OUT.WriteLine("重み");
for (int i1 = 0; i1 <= p; i1++)
OUT.Write(" " + W_p[i1]);
OUT.WriteLine();
OUT.WriteLine("分類結果");
for (int i1 = 0; i1 < n; i1++) {
int s = 0;
for (int i2 = 0; i2 <= p; i2++)
s += E[i1][i2] * W_p[i2];
if (s > 0)
s = 1;
else
s = (s < 0) ? -1 : 0;
for (int i2 = 1; i2 <= p; i2++)
OUT.Write(" " + E[i1][i2]);
OUT.WriteLine(" Cor " + C[i1] + " Res " + s);
}
OUT.Close();
}
if (n == num)
Console.WriteLine(" !!すべてを分類(試行回数:" + n_tri + ")");
else
Console.WriteLine(" !!" + num + " 個を分類");
}
/********************************************/
/* Pocket Algorith with Ratcet */
/* num_p : 正しく分類した訓練例の数 */
/* return : =0 : 最大学習回数 */
/* >0 : すべてを分類(回数) */
/********************************************/
int pocket(ref int num_p)
{
//
// 初期設定
//
num_p = 0;
for (int i1 = 0; i1 <= p; i1++)
W[i1] = 0;
//
// 実行
//
int count = 0, k, run = 0, run_p = 0, sw = -1;
while (sw < 0) {
count++;
if (count > max)
sw = 0;
else {
// 訓練例の選択
k = (int)(rn.NextDouble() * n);
if (k >= n)
k = n - 1;
// 出力の計算
int s = 0;
for (int i1 = 0; i1 <= p; i1++)
s += W[i1] * E[k][i1];
// 正しい分類
if ((s > 0 && C[k] > 0) || (s < 0 && C[k] < 0)) {
run++;
if (run > run_p) {
int num = bunrui();
if (num > num_p) {
num_p = num;
run_p = run;
for (int i1 = 0; i1 <= p; i1++)
W_p[i1] = W[i1];
if (num == n)
sw = count;
}
}
}
// 誤った分類
else {
run = 0;
for (int i1 = 0; i1 <= p; i1++)
W[i1] += C[k] * E[k][i1];
}
}
}
return sw;
}
}
/*
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
*/
'*********************************'
' パーセプトロン学習 '
' (Pocket Algorith with Ratcet) '
' 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 n As Integer = Integer.Parse(str(5))
str = MS.Split(inp.ReadLine().Trim())
Dim name As String = str(1)
inp.Close()
' ネットワークの定義
Dim net As Perceptron = new Perceptron (max, n, p)
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
'************************'
' Perceptronクラスの定義 '
'************************'
Class Perceptron
Private max As Integer ' 最大学習回数
Private n As Integer ' 訓練例の数
Private p As Integer ' 入力セルの数
Private W_p() As Integer ' 重み(ポケット)
Private W() As Integer ' 重み
Private E(,) As Integer ' 訓練例
Private C() As Integer ' 各訓練例に対する正しい出力
Private rn As Random ' 乱数
'****************'
' コンストラクタ '
'****************'
Public Sub New(max_i As Integer, n_i As Integer, p_i As Integer)
'
' 設定
'
max = max_i
n = n_i
p = p_i
rn = new Random() ' 乱数の初期設定
'
' 領域の確保
'
ReDim E(n,p+1)
ReDim W_p(p+1)
ReDim W(p+1)
ReDim C(n)
End Sub
'****************************************'
' 訓練例の分類 '
' return : 正しく分類した訓練例の数 '
'****************************************'
Function bunrui()
Dim num As Integer = 0
For i1 As Integer = 0 To n-1
Dim s As Integer = 0
For i2 As Integer = 0 To p
s += W(i2) * E(i1,i2)
Next
If (s > 0 and C(i1) > 0) or (s < 0 and C(i1) < 0)
num += 1
End If
Next
Return num
End Function
'************************'
' 学習データの読み込み '
' name : ファイル名 '
'************************'
Public Sub input (name As String)
Dim MS As Regex = New Regex("\s+")
Dim inp As StreamReader = New StreamReader(name)
inp.ReadLine()
For i1 As Integer = 0 To n-1
Dim str() As String = MS.Split(inp.ReadLine().Trim())
E(i1,0) = 1
For i2 As Integer = 1 To p
E(i1,i2) = Integer.Parse(str(i2-1))
Next
C(i1) = Integer.Parse(str(p))
Next
inp.Close()
End Sub
'*******************************'
' 学習と結果の出力 '
' pr : =0 : 画面に出力 '
' =1 : ファイルに出力 '
' name : 出力ファイル名 '
'*******************************'
Public Sub learn(pr As Integer, name As String)
' 学習
Dim num As Integer = 0
Dim n_tri As Integer = pocket(num)
' 結果の出力
If pr = 0
Console.WriteLine("重み")
For i1 As Integer = 0 To p
Console.Write(" " & W_p(i1))
Next
Console.WriteLine()
Console.WriteLine("分類結果")
For i1 As Integer = 0 To n-1
Dim s As Integer = 0
For i2 As Integer = 0 To p
s += E(i1,i2) * W_p(i2)
Next
If s > 0
s = 1
Else
If s < 0
s = -1
Else
s = 0
End If
End If
For i2 As Integer = 1 To p
Console.Write(" " & E(i1,i2))
Next
Console.WriteLine(" Cor " & C(i1) & " Res " & s)
Next
Else
Dim OUT As StreamWriter = new StreamWriter(name)
OUT.WriteLine("重み")
For i1 As Integer = 0 To p
OUT.Write(" " & W_p(i1))
Next
OUT.WriteLine()
OUT.WriteLine("分類結果")
For i1 As Integer = 0 To n-1
Dim s As Integer = 0
For i2 As Integer = 0 To p
s += E(i1,i2) * W_p(i2)
Next
If s > 0
s = 1
Else
If s < 0
s = -1
Else
s = 0
End If
End If
For i2 As Integer = 1 To p
OUT.Write(" " & E(i1,i2))
Next
OUT.WriteLine(" Cor " & C(i1) & " Res " & s)
Next
OUT.Close()
End If
If n = num
Console.WriteLine(" !!すべてを分類(試行回数:" & n_tri & ")")
Else
Console.WriteLine(" !!" & num & " 個を分類")
End If
End Sub
'******************************************'
' Pocket Algorith with Ratcet '
' num_p : 正しく分類した訓練例の数 '
' return : =0 : 最大学習回数 '
' >0 : すべてを分類(回数) '
'******************************************'
Function pocket(ByRef num_p As Integer)
'
' 初期設定
'
num_p = 0
For i1 As Integer = 0 To p
W(i1) = 0
Next
'
' 実行
'
Dim k As Integer
Dim count As Integer = 0
Dim run As Integer = 0
Dim run_p As Integer = 0
Dim sw As Integer = -1
Do While sw < 0
count += 1
If count > max
sw = 0
Else
' 訓練例の選択
k = Math.Floor(rn.NextDouble() * n)
If k >= n
k = n - 1
End If
' 出力の計算
Dim s As Integer = 0
For i1 As Integer = 0 To p
s += W(i1) * E(k,i1)
Next
' 正しい分類
If (s > 0 and C(k) > 0) or (s < 0 and C(k) < 0)
run += 1
If run > run_p
Dim num As Integer = bunrui()
If num > num_p
num_p = num
run_p = run
For i1 As Integer = 0 To p
W_p(i1) = W(i1)
Next
If num = n
sw = count
End If
End If
End If
' 誤った分類
Else
run = 0
For i1 As Integer = 0 To p
W(i1) += C(k) * E(k,i1)
Next
End If
End If
Loop
Return sw
End Function
End Class
End Module
/*
---------------------入力ファイル------------
最大試行回数 100 入力セルの数 2 訓練例の数 4
入力データファイル or.dat
---------------------or.dat--------------
OR演算の訓練例.最後のデータが目標出力値
-1 -1 -1
-1 1 1
1 -1 1
1 1 1
*/
| 情報学部 | 菅沼ホーム | 目次 | 索引 |