| 1 | #!/usr/bin/php |
| 2 | <?php |
| 3 | //NMNN - Nervous Man's Neural Network |
| 4 | //Harvie 2oo7/8 |
| 5 | /* |
| 6 | * My first neural network |
| 7 | */ |
| 8 | |
| 9 | ///SETTINGS/INIT |
| 10 | $nmnn_version = '0.1-DEV'; |
| 11 | |
| 12 | |
| 13 | ///FUNCTIONS/////////////////////////////////////////////////////////////////////////////////////// |
| 14 | |
| 15 | function nervous_banner($text) { //Print banner with custom text |
| 16 | echo("\n[*]-== Nervous Man's Neural Network ==-[*]\n"); |
| 17 | $text = explode("\n", $text); |
| 18 | foreach($text as $line) { |
| 19 | $line = trim($line); |
| 20 | echo(" =-[+]\r"); |
| 21 | echo("[+]-= $line\n"); |
| 22 | } |
| 23 | echo("[*]-==================================-[*]\n\n"); |
| 24 | } |
| 25 | |
| 26 | function neural_network_create($net) { //Create new network in $GLOBALS['neural_networks'][$net] |
| 27 | if(isset($GLOBALS['neural_networks'][$net])) { |
| 28 | echo("Net already exists\n"); |
| 29 | return(0); |
| 30 | } |
| 31 | $GLOBALS['neural_networks'][$net] = new neural_network($net); |
| 32 | return(1); |
| 33 | } |
| 34 | |
| 35 | function neural_network($net) { |
| 36 | return($GLOBALS['neural_networks'][$net]); |
| 37 | } |
| 38 | |
| 39 | function global_neuron($net, $id) { |
| 40 | return neural_network($net)->neurons[$id]; |
| 41 | } |
| 42 | |
| 43 | ///CLASSES///////////////////////////////////////////////////////////////////////////////////////// |
| 44 | |
| 45 | class neuron { //Single Neurone class |
| 46 | |
| 47 | var $net = 'N/A'; //ID of network containing this neuron |
| 48 | var $id = 'N/A'; //ID of this neuron |
| 49 | var $treshold = 0; //Treshold is sensitivity of this neuron |
| 50 | var $synapses = array(); //List of neurons connected to dendrites (inputs) |
| 51 | var $decisions = array(); //List of values received from dendrites |
| 52 | var $axon = 'N/A'; //Final decision of this neuron |
| 53 | var $sensor = false; //Is this a sensor? |
| 54 | |
| 55 | function neuron($net, $id, $treshold=0) { //Constructor - Set neuron identification |
| 56 | $this->net = $net; |
| 57 | $this->id = $id; |
| 58 | $this->treshold = $treshold; |
| 59 | } |
| 60 | |
| 61 | function synapse_add($id, $strength=0) { //Connect neuron to dendrite |
| 62 | $this->synapses[$id] = $strength; |
| 63 | } |
| 64 | |
| 65 | function synapse_request($id) { //Request synapse add by another neuron |
| 66 | if(!is_array($id)) { |
| 67 | global_neuron($this->net, $id)->synapse_add($this->id); |
| 68 | } else foreach($id as $id_single) { |
| 69 | global_neuron($this->net, $id_single)->synapse_add($this->id); |
| 70 | } |
| 71 | } |
| 72 | |
| 73 | function synapse_break($id) { //Disconnect neuron from dendrite |
| 74 | unset($this->synapses[$id]); |
| 75 | } |
| 76 | |
| 77 | function debug() { //Print info about this neuron |
| 78 | echo("[i] Info about neuron no.$this->id in $this->net network:\n"); |
| 79 | if($this->sensor) { //if this is sensor print different stuff |
| 80 | echo("\tThis cell is a SENSOR!!!\n\tSensor axon value:$this->axon\n\n"); |
| 81 | return('s'); |
| 82 | } |
| 83 | echo("\tTreshold: $this->treshold\n\tAxon: $this->axon\n"); |
| 84 | echo("\tSynapses:\n"); |
| 85 | print_r($this->synapses); |
| 86 | echo("\tDecisions:\n"); |
| 87 | print_r($this->decisions); |
| 88 | echo("\n"); |
| 89 | } |
| 90 | |
| 91 | function dendrites_read() { //Receive axon values from all neurons connected to dendrites |
| 92 | if($this->sensor) return('s'); |
| 93 | $this->decisions = array(); //Remove old decisions |
| 94 | foreach($this->synapses as $synapse => $strength) { |
| 95 | //print_r (global_neuron($this->net, $synapse)); //debug |
| 96 | global_neuron($this->net, $synapse)->dendrites_read(); |
| 97 | global_neuron($this->net, $synapse)->decide(); |
| 98 | $this->decisions[$synapse]=global_neuron($this->net, $synapse)->axon_get(); |
| 99 | } |
| 100 | } |
| 101 | |
| 102 | function decide() { //Decide final axon (output) value - read dendrites first! |
| 103 | if($this->sensor) return('s'); |
| 104 | $this->axon = 0; //Reset old |
| 105 | foreach($this->decisions as $synapse => $decision) { |
| 106 | $this->axon += $decision * $this->synapses[$synapse]; |
| 107 | } |
| 108 | if($this->axon > $this->treshold) { |
| 109 | $this->axon = 1; |
| 110 | } else { |
| 111 | $this->axon = 0; |
| 112 | } |
| 113 | } |
| 114 | |
| 115 | function axon_get() { |
| 116 | return $this->axon; |
| 117 | } |
| 118 | |
| 119 | function learn($truth) { //Determine, what is truth |
| 120 | if($this->sensor) return('s'); |
| 121 | foreach($this->decisions as $synapse => $decision) { |
| 122 | if($decision == $truth) { |
| 123 | $this->synapses[$synapse]++; |
| 124 | } else { |
| 125 | $this->synapses[$synapse]--; |
| 126 | } |
| 127 | } |
| 128 | } |
| 129 | |
| 130 | function sensor_set($sensor_value, $is_sensor=true) { //Make sensor from this neuron and set axon value |
| 131 | $this->sensor = $is_sensor; |
| 132 | $this->axon = $sensor_value; |
| 133 | } |
| 134 | |
| 135 | } |
| 136 | |
| 137 | |
| 138 | |
| 139 | class neural_network { //Single neural network class |
| 140 | |
| 141 | var $net = 'N/A'; //Name of this network |
| 142 | var $neurons = array(); //Array of neuron objects |
| 143 | |
| 144 | function neural_network($net) { //Constructor - Set network name |
| 145 | $this->net = $net; |
| 146 | } |
| 147 | |
| 148 | function add_neuron($id, $treshold=0) { //Creates new neurone with specified id |
| 149 | if(!isset($this->neurons[$id])) { |
| 150 | $this->neurons[$id] = new neuron($this->net, $id, $treshold); |
| 151 | } else return(0); |
| 152 | } |
| 153 | |
| 154 | function debug() { //Print debug for all neurons in network |
| 155 | echo("###########\nDebug information about $this->net network:\n###########\n\n"); |
| 156 | foreach($this->neurons as $neuron) $neuron->debug(); |
| 157 | } |
| 158 | |
| 159 | function learn($truth) { //Learn all neurons |
| 160 | foreach($this->neurons as $neuron) $neuron->learn($truth); |
| 161 | } |
| 162 | |
| 163 | } |
| 164 | |
| 165 | ///BANNER |
| 166 | nervous_banner("\nNeural network simulator\nCoded by Harvie 2oo7/8\nInfo:\n- Version: $nmnn_version\n- NeuroNet library loaded!\n"); |
| 167 | |
| 168 | /* |
| 169 | 8x ---------------------------------- CUT HERE ---------------------------------- |
| 170 | */ |
| 171 | |
| 172 | ///SAMPLE_NETWORK/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
| 173 | |
| 174 | neural_network_create('neuronet'); //Create new network called neuronet |
| 175 | for($i=1;$i<=6;$i++) neural_network('neuronet')->add_neuron($i,-1); //Create few neurons in neuronet |
| 176 | |
| 177 | /* |
| 178 | Now wee have six neurons floating somewhere in the network space: |
| 179 | |
| 180 | (1) (2) (3) (4) (5) (6) |
| 181 | */ |
| 182 | |
| 183 | //Connect neurons into synapse infrastructure: |
| 184 | global_neuron('neuronet', 1)->synapse_request(array(3,4)); |
| 185 | global_neuron('neuronet', 2)->synapse_request(array(4,5)); |
| 186 | global_neuron('neuronet', 3)->synapse_request(6); |
| 187 | global_neuron('neuronet', 4)->synapse_request(6); |
| 188 | global_neuron('neuronet', 5)->synapse_request(6); |
| 189 | |
| 190 | //Convert neurons 1 and 2 to sensors: |
| 191 | for($i=1;$i<=2;$i++) global_neuron('neuronet', $i)->sensor_set(0, true); |
| 192 | |
| 193 | |
| 194 | /* |
| 195 | After making this synapse infrastructure, we'll get somethinq like this: |
| 196 | |
| 197 | _(3)_ |
| 198 | /--> ]1)_/ \ |
| 199 | Input \_(4)__\_(6> -> Output |
| 200 | \--> ]2)_/ / |
| 201 | \_(5)_/ |
| 202 | |
| 203 | ]1) and ]2) are sensors/receptors/... |
| 204 | (6> is output |
| 205 | |
| 206 | Network structure inspired by: http://en.wikipedia.org/wiki/Image:Neural_network_example.png |
| 207 | |
| 208 | If you can't understand this, i can try to say it easier: "It's something like your brain (but much more complicated)" ;D |
| 209 | Or try to read one of these: |
| 210 | - http://en.wikipedia.org/wiki/Neural_networks |
| 211 | - http://en.wikipedia.org/wiki/Artificial_neural_network |
| 212 | |
| 213 | */ |
| 214 | |
| 215 | //Now, i have neural network and i will try to teach it something |
| 216 | |
| 217 | /* |
| 218 | |
| 219 | I will try to teach this network to compare two booleans |
| 220 | Epected output values: |
| 221 | INPUT | OUTPUT |
| 222 | 0,0 | 1 |
| 223 | 1,1 | 1 |
| 224 | 0,1 | 0 |
| 225 | 1,0 | 0 |
| 226 | |
| 227 | So. Let's try to write some function for this: |
| 228 | |
| 229 | */ |
| 230 | |
| 231 | function same($first, $second) { //This function uses neural network to compare two bools |
| 232 | |
| 233 | global_neuron('neuronet', 1)->sensor_set($first); |
| 234 | global_neuron('neuronet', 2)->sensor_set($second); |
| 235 | |
| 236 | global_neuron('neuronet', 6)->dendrites_read(); |
| 237 | global_neuron('neuronet', 6)->decide(); |
| 238 | $decision = global_neuron('neuronet', 6)->axon_get(); |
| 239 | |
| 240 | echo("$first == $second ?\nnetwork says: $decision (0=NO, 1=YES)\n"); |
| 241 | |
| 242 | return($decision); |
| 243 | } |
| 244 | |
| 245 | /* |
| 246 | |
| 247 | We got nice function (in fact it hardly sux, like whole this network...) |
| 248 | How to use it?: |
| 249 | |
| 250 | */ |
| 251 | |
| 252 | ///Learning: |
| 253 | |
| 254 | same(0,0); //Ask |
| 255 | neural_network('neuronet')->learn('true'); //Correct answer (teach) |
| 256 | neural_network('neuronet')->learn('true'); //Correct answer (teach) |
| 257 | same(1,0); |
| 258 | neural_network('neuronet')->learn('false'); |
| 259 | neural_network('neuronet')->learn('false'); |
| 260 | same(0,1); |
| 261 | neural_network('neuronet')->learn('false'); |
| 262 | neural_network('neuronet')->learn('false'); |
| 263 | |
| 264 | ///Using superinteligent lifeform ehm... 3 neurones brain ;P |
| 265 | |
| 266 | echo("\nI hope it will work now: 8')\n\n"); |
| 267 | same(0,0); //Ask (without teaching) |
| 268 | |
| 269 | //Now, we like to print some stats |
| 270 | neural_network('neuronet')->debug(); //Print some info about neuronet and it's neurons |
| 271 | |
| 272 | |