forked from: Neural Network - Wine Classification
パーセプトロン
/**
* Copyright tepe ( http://wonderfl.net/user/tepe )
* MIT License ( http://www.opensource.org/licenses/mit-license.php )
* Downloaded from: http://wonderfl.net/c/mWe0
*/
// forked from greentec's Neural Network - Wine Classification
package {
import com.bit101.charts.LineChart;
import com.bit101.components.Label;
import com.bit101.components.PushButton;
import com.bit101.components.TextArea;
import flash.display.*;
import flash.text.*;
import flash.events.*;
//パーセプトロン
public class FlashTest extends Sprite {
public var iter:int = 0;
public var oneIter:int = 1;
//各レイヤーのニューロン数
public var inputNeuronNum:int = 13;
public var hiddenNeuronNum:int = 4;
public var outputNeuronNum:int = 3;
//レイヤー
public var inputLayer:Layer;
public var hiddenLayer:Layer;
public var outputLayer:Layer;
//画面構成
public var errorChart:LineChart;//チャート画面
public var proceedNumLabel:Label;//プロセス数
public var debugLabel:Label;//デバッグ表示
public var testButton:PushButton;//testボタン
public var testTextArea:TextField;//テキストエリア
public var resetButton:PushButton;//リセットボタン
public var proceedEnd:Boolean = false;
//パラメータ
public var learnRate:Number = 0.25;
public var _alpha:Number = 0.9; // for momentum
public var beta:Number;
//ワインのデータとか
public var wineTxt:String = "0.787,0.186,0.455,0.278,0.283,0.576,0.42,0.245,0.495,0.292,0.455,0.85,0.54,1,0,0\n0.439,0.555,0.535,0.562,0.391,0.248,0.181,0.075,0.136,0.317,0.244,0.007,0.23,0,0,1\n0.65,0.47,0.674,0.691,0.576,0.145,0.259,0.17,0.265,0.625,0.089,0.011,0.158,0,0,1\n0.532,1,0.412,0.562,0.174,0.566,0.487,0.321,0.505,0.113,0.203,0.67,0.073,0,1,0\n0.479,0.17,0.62,0.371,0.272,0.517,0.428,0.245,0.331,0.226,0.496,0.864,0.526,1,0,0\n0.879,0.239,0.61,0.32,0.467,0.99,0.665,0.208,0.558,0.556,0.309,0.799,0.857,1,0,0\n0.687,0.466,0.642,0.237,0.5,0.593,0.568,0.075,0.394,0.326,0.39,0.766,0.404,1,0,0\n0.445,0.2,0.492,0.613,0.152,0.138,0.3,0.66,0.385,0.172,0.325,0.421,0.15,0,1,0\n0.721,0.229,0.706,0.335,0.489,0.697,0.517,0.491,0.401,0.428,0.528,0.608,0.782,1,0,0\n0.582,0.366,0.807,0.536,0.522,0.628,0.496,0.491,0.445,0.259,0.455,0.608,0.326,1,0,0\n0.221,0.706,0.551,0.536,0.13,0.648,0.568,0.151,0.789,0.13,0.22,0.868,0.073,0,1,0\n0.739,0.668,0.545,0.459,0.207,0.283,0.103,0.66,0.363,0.66,0.073,0.136,0.144,0,0,1\n0.395,0.943,0.684,0.742,0.283,0.279,0.055,0.943,0.218,0.317,0.276,0.154,0.169,0,0,1\n0.276,0.077,0.615,0.691,0.087,0.352,0.262,0.509,0.312,0.078,0.675,0.531,0.251,0,1,0\n0.837,0.652,0.578,0.428,0.446,0.645,0.487,0.321,0.265,0.338,0.317,0.755,0.572,1,0,0\n0.439,0.619,0.556,0.639,0.337,0.638,0.466,0.566,0.486,0.11,0.577,0.681,0.132,0,1,0\n0.75,0.227,0.658,0.227,0.337,0.783,0.679,0.075,0.407,0.354,0.325,0.839,0.583,1,0,0\n0.832,0.168,0.599,0.304,0.413,0.8,0.757,0.358,0.457,0.633,0.61,0.568,1,1,0,0\n0.321,0.621,0.449,0.407,0.457,0.138,0.093,0.302,0.23,0.591,0.138,0.267,0.412,0,0,1\n0.508,0.536,0.529,0.407,0.391,0.141,0.076,0.509,0.167,0.341,0.163,0.176,0.283,0,0,1\n0.1,0,0.61,0.536,0.196,0.517,0.352,0.547,0.325,0.154,0.504,0.381,0.111,0,1,0\n0.871,0.186,0.717,0.742,0.304,0.628,0.205,0.755,0.722,1,0.073,0.253,0.272,0,0,1\n0.321,0.196,0.406,0.433,0.109,0.231,0.357,0.453,0.385,0.181,0.423,0.696,0.165,0,1,0\n0.592,0.178,0.791,0.253,0.435,0.559,0.494,0.396,0.3,0.283,0.496,0.553,0.429,1,0,0\n0.297,0.172,0.508,0.629,0.217,0.276,0.285,0.566,0.363,0.1,0.691,0.363,0.155,0,1,0\n0.613,0.36,0.529,0.485,0.207,0.145,0.034,0.453,0.073,0.369,0.179,0.44,0.358,0,0,1\n0.213,0.03,0.652,0.381,0.261,0.421,0.395,0.17,0.612,0.151,0.252,0.663,0.173,0,1,0\n0.432,0.047,0.471,0.381,0.315,0.421,0.338,0.321,0.331,0.114,0.61,0.692,0.123,0,1,0\n0.332,0.172,0.455,0.505,0.359,0.041,0.143,0.453,0.331,0.151,0.346,0.201,0.422,0,1,0\n0.332,0.48,0.455,0.381,0.196,0.645,0.559,0.604,0.757,0.087,0.764,0.571,0.091,0,1,0\n1,0.178,0.433,0.175,0.293,0.628,0.557,0.302,0.495,0.334,0.488,0.579,0.547,1,0,0\n0.342,0.049,0.316,0.216,0.717,0.317,0.319,0.415,0.741,0.181,0.472,0.381,0.337,0,1,0\n0.75,0.85,0.465,0.485,0.109,0,0,0.509,0.085,0.309,0.081,0.022,0.098,0,0,1\n0.342,0.071,0.492,0.278,0.337,0.369,0.158,0.943,0,0.17,0.626,0.147,0.287,0,1,0\n0.353,0.093,0.642,0.387,0.304,0.497,0.487,0.453,0.527,0.283,0.577,0.377,0.285,0,1,0\n0.745,0.152,0.701,0.742,0.174,0.679,0.532,0.151,0.461,0.179,0.715,0.692,0.094,0,1,0\n0.308,0.453,0.513,0.433,0.283,0.093,0.032,0.509,0.101,0.36,0.146,0.205,0.165,0,0,1\n0.321,0.787,0.631,0.536,0.207,0.138,0.027,0.755,0.123,0.219,0.22,0,0.315,0,0,1\n0.353,0.04,0,0,0.196,0.345,0.049,0.283,0.003,0.057,0.463,0.201,0.173,0,1,0\n0.666,0.196,0.588,0.51,0.5,0.683,0.515,0.132,0.644,0.424,0.407,0.645,0.601,1,0,0\n0.711,0.15,0.717,0.613,0.337,0.697,0.614,0.302,0.621,0.377,0.577,0.527,0.718,1,0,0\n0.808,0.253,0.556,0.423,0.359,0.61,0.544,0.358,0.621,0.42,0.48,0.542,0.558,1,0,0\n0.671,0.364,0.711,0.716,0.38,0.197,0.105,0.491,0.356,0.63,0.211,0.194,0.337,0,0,1\n0.708,0.136,0.61,0.314,0.413,0.834,0.703,0.113,0.514,0.471,0.333,0.586,0.718,1,0,0\n0.595,0.243,0.706,0.32,0.348,0.697,0.61,0.34,0.394,0.403,0.48,0.575,0.708,1,0,0\n0.366,0.172,0.444,0.613,0.413,0.352,0.369,0.396,0.379,0.067,0.472,0.619,0.048,0,1,0\n0.603,0.494,0.545,0.562,0.239,0.328,0.089,0.604,0.265,0.609,0.057,0.128,0.265,0,0,1\n0.766,0.196,0.487,0.351,0.413,0.655,0.675,0.358,0.527,0.65,0.52,0.67,0.7,1,0,0\n0.626,0.613,0.406,0.423,0.217,0.507,0.494,0.264,0.338,0.256,0.35,0.634,0.54,1,0,0\n0.655,0.48,0.727,0.665,0.293,0.197,0.038,0.698,0.044,0.262,0.333,0.289,0.173,0,0,1\n0.276,0.265,0.182,0.356,0.293,0.431,0.386,0.245,0.312,0.172,0.642,0.619,0.308,0,1,0\n0.208,0.194,0.278,0.459,0.174,0.524,0.274,0.453,0.319,0.067,0.374,0.429,0.098,0,1,0\n0.5,0.605,0.69,0.412,0.348,0.493,0.437,0.226,0.495,0.275,0.447,0.824,0.351,1,0,0\n0.276,0.128,0.61,0.613,0.152,0.545,0.411,0.566,0.199,0.138,0.366,0.703,0.076,0,1,0\n0.705,0.97,0.583,0.51,0.272,0.241,0.057,0.736,0.205,0.548,0.13,0.172,0.33,0,0,1\n0.716,0.196,0.561,0.278,0.207,0.559,0.511,0.302,0.442,0.369,0.545,0.597,0.743,1,0,0\n0,0.152,0.449,0.562,0.163,0.51,0.386,0.736,0.505,0.053,1,0.586,0.092,0,1,0\n0.608,0.04,0.535,0.33,0.435,0.534,0.203,0.792,0.003,0.161,0.439,0.242,0.337,0,1,0\n0.255,0.152,0.567,0.588,0.174,0.162,0.192,0.698,0.385,0.198,0.463,0.505,0.123,0,1,0\n0.276,0.215,0.513,0.407,0.12,0.214,0.245,0.736,0.388,0.096,0.488,0.366,0.144,0,1,0\n0.813,0.146,0.513,0.32,0.272,0.421,0.441,0.245,0.366,0.317,0.561,0.568,0.715,1,0,0\n0.192,0.383,0.834,0.485,0.359,0.266,0.357,0.887,0.202,0.215,0.61,0.451,0.235,0,1,0\n0.516,0.184,0.663,1,0.75,0.8,0.538,0.151,0.489,0.177,0.675,0.817,0.504,0,1,0\n0.65,0.211,0.668,0.485,0.283,0.534,0.479,0.283,0.394,0.191,0.52,0.934,0.404,1,0,0\n0.745,0.121,0.487,0.278,0.304,0.69,0.593,0.17,0.454,0.507,0.431,0.835,0.547,1,0,0\n0.266,0.704,0.545,0.588,0.109,0.386,0.297,0.547,0.297,0.113,0.252,0.476,0.215,0,1,0\n0.353,0.065,0.396,0.407,0.196,0.876,0.719,0.208,0.486,0.275,0.455,0.549,0.272,0,1,0\n0.276,0.117,0.503,0.67,0,0.421,0.264,0.547,0.306,0.039,0.48,0.711,0.248,0,1,0\n0.684,0.211,0.717,0.34,0.457,0.645,0.542,0.321,0.331,0.514,0.65,0.59,0.736,1,0,0\n0.624,0.763,0.802,0.742,0.457,0.345,0.131,0.264,0.221,0.616,0.154,0.238,0.251,0,0,1\n0.139,0.259,1,0.923,0.533,0.759,1,0.642,0.461,0.403,0.366,0.886,0.133,0,1,0\n0.374,0.453,0.684,0.845,0.293,0.317,0.051,0.943,0.23,0.531,0.154,0.168,0.429,0,0,1\n0.161,0.261,0.588,0.567,0.152,0.334,0.285,0.66,0.297,0.13,0.423,0.542,0.287,0,1,0\n0.532,0.617,0.513,0.613,0.163,0.231,0.264,0.906,0.382,0.3,0.293,0.271,0.169,0,1,0\n0.345,0.338,0.588,0.536,0.304,0.545,0.373,0.396,0.284,0.13,0.26,0.773,0.114,0,1,0\n0.532,0.196,0.364,0.093,0.239,0.6,0.618,0.075,0.789,0.505,0.52,0.601,0.622,1,0,0\n0.808,0.281,0.503,0.381,0.38,0.679,0.629,0.17,0.621,0.381,0.626,0.696,0.879,1,0,0\n0.621,0.204,0.674,0.284,0.25,0.645,0.549,0.396,0.328,0.3,0.358,0.714,0.654,1,0,0\n0.563,0.366,0.54,0.485,0.543,0.231,0.072,0.755,0.331,0.684,0.098,0.128,0.401,0,0,1\n0.311,0.089,0.209,0.32,0.88,0.3,0.198,0.019,0.659,0.134,0.65,0.659,0.314,0,1,0\n0.458,0.532,0.332,0.278,0.109,0.224,0.192,0.566,0.132,0.181,0.179,0.311,0.067,0,1,0\n0.797,0.176,0.492,0.278,0.609,0.697,0.597,0.208,0.533,0.373,0.496,0.894,0.358,1,0,0\n0.458,0.326,0.492,0.459,0.174,0.141,0.036,0.66,0.073,0.735,0.073,0.132,0.137,0,0,1\n0.389,0.099,0.476,0.356,0.163,0.352,0.051,0.887,0.265,0.356,0.22,0.088,0.265,0,0,1\n0.155,0.247,0.492,0.381,0.304,0.703,0.405,0.075,0.297,0.168,0.553,0.619,0.048,0,1,0\n0.884,0.223,0.583,0.206,0.283,0.524,0.46,0.321,0.495,0.339,0.439,0.846,0.722,1,0,0\n0.666,0.192,0.508,0.289,0.511,0.748,0.622,0.396,0.609,0.414,0.382,0.773,0.369,1,0,0\n0.5,0.409,0.717,0.536,0.283,0.193,0.034,0.755,0.107,0.283,0.236,0.381,0.23,0,0,1\n0.839,0.642,0.615,0.134,0.63,0.697,0.57,0.132,0.527,0.326,0.333,0.828,0.344,1,0,0\n0.471,0.52,0.503,0.459,0.196,0.172,0.068,0.509,0.177,0.766,0.195,0.176,0.29,0,0,1\n0.484,0.765,0.599,0.562,0.174,0.248,0.065,0.642,0.142,0.544,0.049,0.216,0.248,0,0,1\n0.671,0.182,0.535,0.438,0.391,0.648,0.601,0.17,0.486,0.48,0.496,0.59,0.882,1,0,0\n0.624,0.626,0.599,0.639,0.348,0.283,0.086,0.566,0.315,0.514,0.179,0.106,0.337,0,0,1\n0.682,0.832,0.529,0.485,0.239,0.352,0.097,0.642,0.192,0.266,0.35,0.286,0.194,0,0,1\n0.589,0.7,0.481,0.485,0.543,0.21,0.074,0.566,0.297,0.761,0.089,0.106,0.397,0,0,1\n0.547,0.229,0.743,0.768,0.5,0.421,0.198,0.245,0.363,0.497,0.106,0.022,0.105,0,0,1\n0.113,0.593,0.246,0.459,0.402,0.759,0.473,0.208,1,0.138,0.22,0.564,0.203,0,1,0\n0.579,0.506,0.492,0.407,0.304,0.283,0.103,0.906,0.461,0.788,0.065,0.088,0.283,0,0,1\n0.255,0.036,0.342,0.433,0.174,0.497,0.405,0.321,0.322,0.104,0.732,0.678,0,0,1,0\n0.153,0.121,0.717,0.485,0.261,0.607,0.544,0.302,0.656,0.117,0.39,0.729,0.287,0,1,0\n0.379,0.154,0.449,0.433,1,0.524,0.407,0.358,0.905,0.113,0.553,0.498,0.47,0,1,0\n0.537,0.15,0.396,0.253,0.304,0.49,0.485,0.283,0.303,0.206,0.569,0.52,0.529,1,0,0\n0.647,0.182,0.471,0.691,0.185,0.31,0.316,0.264,0.196,0.21,0.407,0.553,0.138,0,1,0\n0.834,0.202,0.583,0.237,0.457,0.79,0.643,0.396,0.492,0.467,0.463,0.579,0.836,1,0,0\n0.734,0.2,0.567,0.175,0.446,1,0.717,0.358,0.461,0.492,0.431,0.729,0.65,1,0,0\n0.463,0.381,0.599,0.588,0.457,0.172,0.215,0.208,0.268,0.812,0,0.073,0.144,0,0,1\n0.571,0.206,0.417,0.031,0.326,0.576,0.511,0.245,0.274,0.265,0.463,0.78,0.551,1,0,0\n0.166,0.225,0.299,0.278,0.293,0.217,0.259,0.396,0.233,0.215,0.61,0.319,0.107,0,1,0\n0.353,0.176,0.503,0.716,0.196,0.428,0.445,0.509,0.47,0.072,0.333,0.553,0.046,0,1,0\n0.563,0.879,0.513,0.588,0.25,0.262,0.061,0.906,0.36,0.565,0.098,0.077,0.319,0,0,1\n0.724,0.399,0.503,0.588,0.217,0.128,0.072,0.528,0.196,0.708,0.179,0.15,0.24,0,0,1\n0.313,0.109,0.31,0.433,0.239,0.476,0.359,0.491,0.527,0.121,0.309,0.641,0.024,0,1,0\n0.482,0.121,0.513,0.381,0.565,0.183,0.192,0.151,0.167,0.241,0.228,0.007,0.251,0,0,1\n0.332,0.132,0.332,0.278,0.163,0.541,0.456,0.302,0.429,0.138,0.61,0.538,0.107,0,1,0\n0.163,0.184,0.674,0.794,0.196,0.324,0.268,0.509,0.293,0.113,0.715,0.711,0.203,0,1,0\n0.476,0.439,0.668,0.691,0.337,0.462,0.055,0.755,0.126,0.311,0.333,0.322,0.223,0,0,1\n0.332,0.413,0.46,0.381,0.196,0.507,0.403,0.226,0.498,0.074,0.545,0.744,0.009,0,1,0\n0.842,0.192,0.572,0.258,0.62,0.628,0.574,0.283,0.593,0.372,0.455,0.971,0.561,1,0,0\n0.697,0.215,0.535,0.34,0.37,0.497,0.496,0.547,0.492,0.218,0.61,0.586,0.508,1,0,0\n0.705,0.221,0.535,0.309,0.337,0.562,0.536,0.264,0.404,0.215,0.512,1,0.54,1,0,0\n0.3,0.14,0.626,0.433,0.37,0.314,0.297,0.604,0.196,0.142,0.789,0.352,0.055,0,1,0\n0.487,0.445,0.556,0.485,0.37,0.11,0.186,0.208,0.132,0.352,0.211,0.055,0.18,0,0,1\n0.424,0.123,0.353,0.32,0.326,0.359,0.226,0.755,0.066,0.381,0.407,0.117,0.123,0,1,0\n0.882,0.563,0.492,0.278,0.348,0.783,0.597,0.264,0.562,0.309,0.455,0.795,0.561,1,0,0\n0.839,0.19,0.503,0.294,0.522,0.766,0.561,0.245,0.511,0.435,0.374,0.747,0.494,1,0,0\n0.797,0.279,0.668,0.361,0.554,0.559,0.458,0.34,0.265,0.322,0.472,0.846,0.725,1,0,0\n0.35,0.611,0.545,0.536,0.196,0.455,0.122,0.698,0.199,0.544,0.065,0.114,0.173,0,0,1\n0.824,0.35,0.599,0.485,0.228,0.241,0.076,0.585,0.262,0.718,0.114,0.161,0.272,0,0,1\n0.755,0.186,0.406,0.278,0.337,0.731,0.643,0.151,0.546,0.411,0.35,0.755,0.504,1,0,0\n0.111,0.328,0.567,0.485,0.283,0.662,0.517,0.358,0.448,0.168,0.26,0.777,0.248,0,1,0\n0.582,0.64,0.497,0.356,0.359,0.572,0.483,0.358,0.394,0.263,0.276,0.634,0.287,1,0,0\n0.2,0.275,0.759,0.923,0.239,0.397,0.401,0.849,0.426,0.147,0.398,0.429,0.134,0,1,0\n0.468,0.31,0.556,0.691,0.304,0.059,0.158,0.264,0.132,0.377,0.146,0.033,0.201,0,0,1\n0.597,0.194,0.417,0.33,0.261,0.49,0.39,0.264,0.297,0.228,0.439,0.549,0.718,1,0,0\n0.366,0.358,0.487,0.588,0.217,0.241,0.316,1,0.319,0.121,0.309,0.744,0.026,0,1,0\n0.245,0.069,0.503,0.536,0.337,0.828,0.38,0,0.391,0.165,0.415,0.681,0.434,0,1,0\n0.413,0.34,0.449,0.407,0.261,0.221,0.068,0.943,0.167,0.497,0.203,0.114,0.297,0,0,1\n0.645,0.211,0.561,0.51,0.326,0.593,0.557,0.245,0.457,0.326,0.455,0.806,0.458,1,0,0\n0.526,0.032,0.187,0.278,0.174,0.334,0.357,0.208,0.331,0.283,0.577,0.443,0.081,0,1,0\n0.408,0.109,0.396,0.485,0.359,0.172,0.051,0.755,0.312,0.539,0.081,0.103,0.258,0,0,1\n0.389,0.196,0.332,0.51,0.163,0.421,0.333,0.358,0.338,0.142,0.455,0.842,0.281,0,1,0\n0.737,0.164,0.674,0.485,0.489,0.679,0.646,0.509,0.413,0.454,0.528,0.476,0.608,1,0,0\n0.532,0.204,0.396,0.33,0.402,0.697,0.561,0.283,0.511,0.321,0.325,0.762,0.433,1,0,0\n0.882,0.223,0.545,0.072,0.348,0.8,0.696,0.302,0.804,0.531,0.585,0.634,0.905,1,0,0\n0.653,0.209,0.69,0.433,0.435,0.472,0.462,0.302,0.356,0.249,0.504,0.586,0.583,1,0,0\n0.816,0.664,0.738,0.716,0.283,0.369,0.089,0.811,0.297,0.676,0.106,0.121,0.201,0,0,1\n0.637,0.585,0.663,0.639,0.446,0.248,0.122,0.566,0.331,0.802,0.301,0.106,0.297,0,0,1\n0.445,0.211,0.449,0.423,0.174,0.421,0.462,0.245,0.429,0.224,0.553,0.685,0.311,0,1,0\n0.368,0.156,0.497,0.562,0.174,0.607,0.593,0.491,0.429,0.227,0.171,0.575,0.053,0,1,0\n0.532,0.18,0.636,0.381,0.304,0.507,0.441,0.302,0.325,0.253,0.52,0.454,0.59,1,0,0\n0.561,0.559,0.422,0.536,0.348,0.179,0.044,0.566,0.281,0.232,0.098,0.15,0.394,0,0,1\n0.213,0.425,0.465,0.381,0.457,0.255,0.207,0.566,0.17,0.117,0.39,0.458,0.158,0,1,0\n0.353,0.085,0.299,0.464,0.087,0.39,0.35,0.264,0.199,0.29,0.52,0.81,0.165,0,1,0\n0.747,0.229,0.77,0.454,0.402,0.679,0.555,0.453,0.426,0.275,0.626,0.78,0.454,1,0,0\n0.274,0.281,0.433,0.536,0.163,0.559,0.487,0.453,0.297,0.126,0.309,0.736,0.071,0,1,0\n0.713,0.184,0.476,0.299,0.522,0.559,0.54,0.151,0.382,0.39,0.358,0.707,0.558,1,0,0\n0.861,0.233,0.727,0.485,0.543,0.628,0.591,0.377,0.492,0.42,0.48,0.505,0.715,1,0,0\n0.353,0.077,0.428,0.433,0.185,0.869,0.582,0.113,0.461,0.27,0.602,0.586,0.101,0,1,0\n0.647,0.563,0.444,0.459,0.196,0.221,0.03,0.849,0.148,0.377,0.268,0.201,0.215,0,0,1\n0.392,0.334,0.433,0.536,0.196,0.541,0.407,0.245,0.256,0.061,0.341,0.553,0.034,0,1,0\n0.437,0.156,0.481,0.521,0.109,0.138,0.236,0.849,0.382,0.151,0.39,0.289,0.155,0,1,0\n0.645,0.184,0.684,0.613,0.207,0.559,0.16,0.736,0.593,0.893,0.073,0.187,0.244,0,0,1\n0.561,0.32,0.701,0.412,0.337,0.628,0.612,0.321,0.757,0.375,0.447,0.696,0.647,1,0,0\n0.979,0.196,0.551,0.041,0.228,0.731,0.707,0.566,0.757,0.352,0.626,0.535,0.622,1,0,0\n0.718,0.156,0.717,0.459,0.674,0.679,0.506,0.698,0.297,0.352,0.626,0.634,0.683,1,0,0\n0.737,0.18,0.663,0.34,0.261,0.507,0.559,0.17,0.593,0.369,0.618,0.769,0.704,1,0,0\n0.208,0.144,0.337,0.526,0.174,0.345,0.266,0.321,0.353,0.057,0.382,0.755,0.155,0,1,0\n0.532,0.259,0.995,0.742,0.587,0.569,0.494,0.642,0.476,0.196,0.528,0.707,0.394,1,0,0\n0.413,0.119,0.289,0.407,0.196,0.162,0.215,0.302,0.297,0.1,0.455,0.549,0.203,0,1,0\n0.711,0.715,0.481,0.613,0.196,0.103,0.027,0.736,0.233,0.456,0.244,0.176,0.173,0,0,1\n0.7,0.498,0.631,0.485,0.402,0.293,0.046,0.698,0.123,0.392,0.39,0.201,0.287,0,0,1\n0.205,0.273,0.738,0.562,0.696,0.214,0.137,0.019,0.363,0.104,0.382,0.363,0.248,0,1,0\n0.255,0.532,0.342,0.433,0.185,0.352,0.274,0.453,0.461,0,0.366,0.652,0.204,0,1,0\n0.539,0.625,0.535,0.562,0.467,0.148,0.222,0.396,0.23,0.693,0.073,0.022,0.194,0,0,1\n0.547,0.053,0.182,0.227,0.087,0.69,0.599,0.245,0.59,0.343,0.52,0.7,0.16,0,1,0\n0.695,0.101,0.299,0.381,0.261,0.386,0.306,0.358,0.101,0.215,0.61,0.436,0.251,0,1,0\n0.479,0.5,0.652,0.588,0.391,0.231,0.055,0.887,0.174,0.367,0.317,0.308,0.208,0,0,1\n0.366,0.729,0.733,0.82,0.348,0.421,0.378,0.566,0.41,0.068,0.358,0.678,0.062,0,1,0";
public var wineTxtLines:Array;
public var wineTxtArray:Array;
public var lineShape:Shape;
//エントリ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
public function FlashTest() {
// write as3 code here..
this.graphics.beginFill(0xdddddd);
this.graphics.drawRect(0,0,465,465);
this.graphics.endFill();
stage.scaleMode = "noScale";
lineShape = new Shape();
addChild(lineShape);//シナプスライン
var line:Array;
var i:int;
wineTxtLines = wineTxt.split("\n");
wineTxtArray = [];
for (i = 0; i < wineTxtLines.length; i++){
//wineTxtLines[i] = wineTxtLines[i].replace (/\s*\R/g, "");
line = wineTxtLines[i].split(",");
wineTxtArray.push(line);
}
var neuron:Neuron;
inputLayer = new Layer();
for (i = 0; i < inputNeuronNum; i++){
neuron = new Neuron(hiddenNeuronNum);
inputLayer.neurons.push(neuron);
neuron.x = 465 * 3 / 4 + (-(inputNeuronNum + 1) / 2 + i) * 16; //graphic
neuron.y = 40;
addChild(neuron);
}
neuron = new Neuron(hiddenNeuronNum);
neuron.biased = true; //biased One
neuron.x = 465 * 3 / 4 + (-(inputNeuronNum + 1) / 2 + i) * 16;
neuron.y = 40;
addChild(neuron);
inputLayer.neurons.push(neuron);
hiddenLayer = new Layer();
for (i = 0; i < hiddenNeuronNum; i++){
neuron = new Neuron(outputNeuronNum);
hiddenLayer.neurons.push(neuron);
neuron.x = 465 * 3 / 4 + (-(hiddenNeuronNum + 1) / 2 + i) * 16;
neuron.y = 95;
addChild(neuron);
}
neuron = new Neuron(outputNeuronNum);
neuron.biased = true; //biased One
neuron.x = 465 * 3 / 4 + (-(hiddenNeuronNum + 1) / 2 + i) * 16;
neuron.y = 95;
addChild(neuron);
hiddenLayer.neurons.push(neuron);
outputLayer = new Layer();
for (i = 0; i < outputNeuronNum; i++){
neuron = new Neuron(0);
outputLayer.neurons.push(neuron);
neuron.x = 465 * 3 / 4 + (-outputNeuronNum / 2 + i) * 16;
neuron.y = 150;
addChild(neuron);
}
beta = 0.7 * Math.pow(hiddenNeuronNum, (1 / inputNeuronNum) );
weightInit();
proceedNumLabel = new Label(this, 10, 10, "Proceed #0");
errorChart = new LineChart(this, 10, proceedNumLabel.y + proceedNumLabel.height + 5);
errorChart.data = [];
debugLabel = new Label(this, 10, errorChart.y + errorChart.height + 5, "");
testButton = new PushButton(this, 10, debugLabel.y + debugLabel.height + 20, "Test", onTest);
//testTextArea = new TextArea(this, 10, testButton.y + testButton.height + 5, "");
testTextArea = new TextField();
addChild(testTextArea);
with(testTextArea){
border=true;
text = "test";
y = 200;
}
testTextArea.width = 465 - 20;
testTextArea.height = 465 - 10 - testTextArea.y;
resetButton = new PushButton(this, testButton.x + testButton.width + 10, testButton.y, "Reset", onReset);
addEventListener(Event.ENTER_FRAME, onLoop);
//testTextArea.text += wineTxt+"\n";
}
//初期化
public function weightInit():void{
// Nguyen-Widrow Initialization - for all Input to Hidden w
var normHidden:Number;
var j:int;
var i:int;
normHidden = 0;
for (i = 0; i < hiddenNeuronNum; i++){
for (j = 0; j < inputNeuronNum + 1; j++){
normHidden += inputLayer.neurons[j].w[i] * inputLayer.neurons[j].w[i];
}
normHidden = Math.sqrt(normHidden);
for (j = 0; j < inputNeuronNum + 1; j++){
inputLayer.neurons[j].w[i] *= beta / normHidden;
}
}
}
//リセット
public function onReset(e:Event):void{
if (hasEventListener(Event.ENTER_FRAME)){
removeEventListener(Event.ENTER_FRAME, onLoop);
}
var i:int;
for (i = 0; i < inputNeuronNum + 1; i++){
inputLayer.neurons[i].resetW(hiddenNeuronNum);
}
for (i = 0; i < hiddenNeuronNum + 1; i++){
hiddenLayer.neurons[i].resetW(outputNeuronNum);
}
weightInit();
iter = 0;
proceedEnd = false;
errorChart.data = [];
addEventListener(Event.ENTER_FRAME, onLoop);
}
//テスト
public function onTest(e:Event=null):void{
var arr:Array = printRandomNumber(wineTxtArray.length, 1);
var ideal:int;
var i:int;
var j:int;
for (var s:int = 0; s < arr.length; s++){
for (i = 0; i < inputNeuronNum; i++){
inputLayer.neurons[i].output = sigmoid(parseFloat(wineTxtArray[arr[s]][i]));//入力
}
inputLayer.neurons[inputNeuronNum].output = 1; // biased
for (i = 0; i < hiddenNeuronNum; i++){
hiddenLayer.neurons[i].input = 0;//値リセット
for (j = 0; j < inputNeuronNum + 1; j++){
hiddenLayer.neurons[i].input += inputLayer.neurons[j].output * inputLayer.neurons[j].w[i];
}
hiddenLayer.neurons[i].output = sigmoid(hiddenLayer.neurons[i].input);
}
hiddenLayer.neurons[hiddenNeuronNum].output = 1; // biased
for (i = 0; i < outputNeuronNum; i++){
outputLayer.neurons[i].input = 0;
for (j = 0; j < hiddenNeuronNum + 1; j++){
outputLayer.neurons[i].input += hiddenLayer.neurons[j].output * hiddenLayer.neurons[j].w[i];
}
outputLayer.neurons[i].output = sigmoid(outputLayer.neurons[i].input);
}
//テキスト出力
var str:String = "Sample #" + String(arr[s]) + "\n";
str += "出力値 : " + String(Math.round(outputLayer.neurons[0].output)) + ", ";
str += String(Math.round(outputLayer.neurons[1].output)) + ", ";
str += String(Math.round(outputLayer.neurons[2].output)) + "\n正解値 : " + wineTxtArray[arr[s]][13] + ", ";
str += wineTxtArray[arr[s]][14] + ", " + wineTxtArray[arr[s]][15] + "\n";// + "\t Error : " + String(int(outputLayer.neurons[0].output * 10000) / 100) + " % \n";
str += "精度 : ";
for (i = 0; i < 3; i++){
if (wineTxtArray[arr[s]][i + inputNeuronNum] == "1")
str += (int(outputLayer.neurons[i].output * 10000) / 100).toString()+"%, ";
else
str += (int((1 - outputLayer.neurons[i].output) * 10000) / 100).toString()+"%, ";
}
testTextArea.appendText(str+"\n");
testTextArea.scrollV = testTextArea.maxScrollV;
}
draw();
}
//ループ
public function onLoop(e:Event):void{
var sumError:Number = 0;
var ideal:int;
var i:int;
var j:int;
if (true){
for (var m:int = 0; m < oneIter; m++){
sumError = 0;//エラーカウンタ
iter += 1;
for (var s:int = 0; s < wineTxtArray.length; s++){
//入力層
for (i = 0; i < inputNeuronNum; i++){
//output
inputLayer.neurons[i].output = sigmoid(parseFloat(wineTxtArray[s][i]));
}
inputLayer.neurons[inputNeuronNum].output = 1; // biased
//中間層
for (i = 0; i < hiddenNeuronNum; i++){
hiddenLayer.neurons[i].input = 0;
for (j = 0; j < inputNeuronNum + 1; j++){
//input += 入力値 * 重み
hiddenLayer.neurons[i].input += inputLayer.neurons[j].output * inputLayer.neurons[j].w[i];
}
//output
hiddenLayer.neurons[i].output = sigmoid(hiddenLayer.neurons[i].input);//出力値の決定
}
hiddenLayer.neurons[hiddenNeuronNum].output = 1; // biased
//出力層
for (i = 0; i < outputNeuronNum; i++){
outputLayer.neurons[i].input = 0;
for (j = 0; j < hiddenNeuronNum + 1; j++){
outputLayer.neurons[i].input += hiddenLayer.neurons[j].output * hiddenLayer.neurons[j].w[i];
}
outputLayer.neurons[i].output = sigmoid(outputLayer.neurons[i].input);
outputLayer.neurons[i].error = wineTxtArray[s][inputNeuronNum + i] - outputLayer.neurons[i].output;
sumError += outputLayer.neurons[i].error * outputLayer.neurons[i].error;
outputLayer.neurons[i].nodeDelta = outputLayer.neurons[i].error * outputLayer.neurons[i].output * (1 - outputLayer.neurons[i].output);
}
//バックプロパゲーション
for (i = 0; i < hiddenNeuronNum + 1; i++){ //中間層
hiddenLayer.neurons[i].nodeDelta = 0;//リセット
for (j = 0; j < outputNeuronNum; j++){//出力層
//deltaW更新
hiddenLayer.neurons[i].deltaW[j] =
learnRate * hiddenLayer.neurons[i].output * outputLayer.neurons[j].nodeDelta +
_alpha * hiddenLayer.neurons[i].deltaW[j];
//w更新
hiddenLayer.neurons[i].w[j] += hiddenLayer.neurons[i].deltaW[j]; //重み付け更新
//nodeDelta
hiddenLayer.neurons[i].nodeDelta +=
outputLayer.neurons[j].nodeDelta * hiddenLayer.neurons[i].w[j]; //get hidden neuron's nodeDelta
}
//nodeDelta
hiddenLayer.neurons[i].nodeDelta *=
hiddenLayer.neurons[i].output * (1 - hiddenLayer.neurons[i].output);
}
for (i = 0; i < inputNeuronNum + 1; i++){//入力層
for (j = 0; j < hiddenNeuronNum; j++){//中間層
//deltaW
inputLayer.neurons[i].deltaW[j] =
learnRate * inputLayer.neurons[i].output * hiddenLayer.neurons[j].nodeDelta +
_alpha * inputLayer.neurons[i].deltaW[j];
//w
inputLayer.neurons[i].w[j] += inputLayer.neurons[i].deltaW[j]; //weight update
}
}
}
if (sumError < 1){//精度が高まったら学習終了
//i = iter + 1;
proceedEnd = true;
break;
}
}
proceedNumLabel.text = "Proceed #" + String(iter);
errorChart.data.push(sumError);//チャートにデータ追加
errorChart.draw();//チャート画面更新
debugLabel.text = "Sum of Error : " + String(sumError);
}
draw();//描画
if (proceedEnd == true){//学習が終了した時だけ処理
onTest();
removeEventListener(Event.ENTER_FRAME, onLoop);
}
}
//描画
private function draw():void{
var lineThick:Number;
var lineColor:uint;
const c1:uint = 0x2a80b9;
const c2:uint = 0xa31605;
var i:int;
var j:int;
lineShape.graphics.clear();
for(i=0;i<inputNeuronNum;i++){
if(0.65<inputLayer.neurons[i].output)inputLayer.neurons[i].draw(0xff0000);
else inputLayer.neurons[i].draw(0xffffff);
}
for(i=0;i<hiddenNeuronNum+1;i++){
if(1<hiddenLayer.neurons[i].input)hiddenLayer.neurons[i].draw(0xff0000);
else hiddenLayer.neurons[i].draw(0xffffff);
}
for(i=0;i<outputNeuronNum;i++){
if(1<outputLayer.neurons[i].input)outputLayer.neurons[i].draw(0xff0000);
else outputLayer.neurons[i].draw(0xffffff);
}
//入力層-中間層
for (i = 0; i < inputNeuronNum+1; i++){//入力層
for (j = 0; j < hiddenNeuronNum; j++){//中間層
//wが0以上なら赤 マイナスなら青
lineColor = inputLayer.neurons[i].w[j] >= 0 ? c1 : c2;//色
//wの値が0から離れているほど太く描画する
lineThick = Math.abs(inputLayer.neurons[i].w[j]);
lineThick = lineThick/10 > 3 ? 3 : ( lineThick < 0.1 ? 0.1 : lineThick/10 );//太さ
lineShape.graphics.lineStyle(lineThick, lineColor,0.8);
lineShape.graphics.moveTo(inputLayer.neurons[i].x, inputLayer.neurons[i].y);
lineShape.graphics.lineTo(hiddenLayer.neurons[j].x, hiddenLayer.neurons[j].y);
}
//if(0.0==inputLayer.neurons[i].w)inputLayer.neurons[i].draw(0xff0000);
//else inputLayer.neurons[i].draw(0xffaaff);
}
//中間層-出力層
for (i = 0; i < hiddenNeuronNum + 1; i++){//中間層
for (j = 0; j < outputNeuronNum; j++){//出力層
lineColor = hiddenLayer.neurons[i].w[j] >= 0 ? c1 : c2;
lineThick = Math.abs(hiddenLayer.neurons[i].w[j]);
lineThick = lineThick/10 > 3 ? 3 : ( lineThick < 0.1 ? 0.1 : lineThick/10 );
lineShape.graphics.lineStyle(lineThick, lineColor);
lineShape.graphics.moveTo(hiddenLayer.neurons[i].x, hiddenLayer.neurons[i].y);
lineShape.graphics.lineTo(outputLayer.neurons[j].x, outputLayer.neurons[j].y);
}
}
}
//^^^ シグモイド関数 ^^^^
public function sigmoid(n:Number):Number{
return 1 / (1 + 1 / Math.exp(n));
}
//^^^^^^^^^^^^^
private function printRandomNumber(n:int, k:int) : Array{
var original:Array= new Array();
var result:Array= new Array();
var i:int;
for(i=0;i<n;i++){
original.push(i);//整数を順に追加
}
for(i=0;i<k;i++){
var randInt:int = Math.random()*(n-i) + i;//乱数生成
//並べ替え
var temp:Object = original[i];
original[i] = original[randInt];
original[randInt] = temp;
result.push(original[i]);
}
return result;
}
}
}
//^^^^^ ニューロンクラス ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
import flash.display.Shape;
class Neuron extends Shape{
public var w:Object;
public var deltaW:Object;
public var updateValue:Object;
public var prevGradient:Object;
public var input:Number;
public var output:Number;
public var error:Number;
public var nodeDelta:Number;
public var gradient:Object;
public var gradientChanged:Object;
public var biased:Boolean = false;
//インスタンス
public function Neuron(n:int){
draw();
this.w = new Object();
this.deltaW = new Object();
this.updateValue = new Object();
this.prevGradient = new Object();
this.gradient = new Object();
this.gradientChanged = new Object();
if(n > 0){
for(var i:int = 0; i < n; i++){
this.w[i] = Math.random() * 2 - 1;
this.deltaW[i] = 0;
this.updateValue[i] = 0.01;
this.gradient[i] = 0;
this.prevGradient[i] = 0;
this.gradientChanged[i] = 0;
}
}
}
//リセット
public function resetW(n:int):void{
for(var i:int=0; i<n; i++){
this.w[i] = Math.random() * 2 - 1;
this.deltaW[i] = 0;
this.updateValue[i] = 0.01;
this.gradient[i] = 0;
this.prevGradient[i] = 0;
this.gradientChanged[i] = 0;
this.error = 0;
this.nodeDelta = 0;
}
}
public function draw(col:uint=0xffffff):void{
//描画
this.graphics.clear();
this.graphics.lineStyle(2, 0);
this.graphics.beginFill(col);
this.graphics.drawCircle(0, 0, 6);
this.graphics.endFill();
}
}
//^^^^ レイヤークラス ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//階層
class Layer{
public var neurons:Array;//ニューロンのリスト
public function Layer(){
this.neurons = [];
}
}