スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[WP]no.013 学習細胞的な何か


Neuron(脳細胞)とかいうクラス名になってますが、そこまで専門的な事はやっていないです。入門・基礎レベル。
ハードウェアレベル(論理回路)でも書けるレベル。


「xxxという値が与えられたとき、これはtrueか?falseか?」を行うneuronです。
neuronが保持する状態として、「xxという値はたぶんtrue、yyという値は絶対false、zzという値はたぶんfalse…」を記憶します。

「xxはfalseでした」→「xxという値はたぶんfalse」
「xxはtrueでした」→「xxという値は絶対true」
と、状態を変化させれば、学習できます。

一部テストしていない関数があります。うpしていいのか。

Neuron.h

class Neuron{
private:
int numin; // 入力パターン数
int numstatus;// 状態数/2
int *memory; // 状態
int previn; // 直前の入力
void ChkIdx(int);
public:
Neuron(int in,int stat):numin(in),numstatus(stat){
memory = new int[in];
Initialize();
};
~Neuron(){
delete memory;
}
// 値がtrue/falseか予想する
bool Predict(int);
// 値がtrue/falseであったことを学習させる
void Learn(int,bool);
void Learn(bool);
// 初期化
void Initialize(int,int);
void Initialize(int);
void Initialize();
};


Neuron.cpp

#include "Neuron.h"

// 値がtrue/falseか予想する
bool Neuron::Predict(int in){
previn=in%numin;
return memory[previn]>=0;
}
// 値がtrue/falseであったことを学習させる
void Neuron::Learn(int in,bool res){
memory[in%numin]+=res?1:-1;
}
void Neuron::Learn(bool res){
memory[previn]+=res?1:-1;
}
// 初期化
void Neuron::Initialize(int in,int val){
if (in<0 || numin<=in) return;
memory[in]=(val<-numstatus)?-numstatus:
((numstatus<=val)?(numstatus-1):val);
}
void Neuron::Initialize(int val){
val=(val<-numstatus)?-numstatus:
((numstatus<=val)?(numstatus-1):val);
for (int i=0;i<numin;)
memory[i++]=val;
}
void Neuron::Initialize(){
Initialize(0);
}




テストプログラム

前回のneuronの出力、前の文字から、次の文字を推測します。(7bit)
といっても、bit単位で推測・評価しますが。
標準入力から文字列を入力します。

bit単位でhit,missを計算するので、文字が一致したか否かについては実用性皆無な値です。
neuronがんばってるヨーということは示せるかな、程度です。

7つのNeuronクラスが動作しますが、互いに独立なので、単細胞な結果が得られます。

乱数も面倒なので、全部0(false)で初期化してます。

// とっても雑
#include <iostream>
using namespace std;
#include "Neuron.h"

int main(){
int i;
char c,pc; // pc:前回の文字 c:今回の文字
bool r;

int hit=0,miss=0;
Neuron **neuron= new Neuron*[7];
bool pr[7]; // 前回のneuronの結果

for (i=0;i<7;i++){
neuron[i]=new Neuron(4,4);
pr[i]=0;
}

cin >> pc; // prev c

while (cin >> c){ // ctrl+Dで入力終了。
for (i=0;i<7;i++){
r=neuron[i]->Predict(((pc>>i)&1) |(pr[i]<<1));
if ((int)r == ((c>>i)&1)) hit++;else miss++;
neuron[i]->Learn((c>>i)&1);
pr[i]=r;
// cout <<"predict:"<<r<<" result:"<<((c>>i)&1)<<endl;
}
}
cout << "result:\n";
cout << "hit:" << hit << " miss:"<<miss<<endl;

for (i=0;i<7;i++)
delete neuron[i];
delete[] neuron;

return 0;
}

滅茶苦茶なので補足

(c>>i)&1) : 文字cのiビット目
((pc>>i)&1) |(pr[i]<<1) : 前文字cのiビット目と前回のneuron[i]の結果を結合(2bit)


テストプログラム入力例と結果

$ ./a
aaaaaaa
result:
hit:34 miss:8

$ ./a
abcdefghijklmnopqrstuvwxyz
result:
hit:108 miss:67

$ cat Neuron.cpp | ./a
result:
hit:2700 miss:1598

スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : c++ アルゴリズムとデータ構造

コメントの投稿

非公開コメント

ブログ移転のお知らせ
ブログをshonen.hateblo.jpに移転します. 新規の記事はこちらに投稿します.
プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
635位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
94位
アクセスランキングを見る>>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。