/// <summary> /// Calculates weights for the hopfield net to learn the specified training /// set /// </summary> /// <param name="trainingSet"> /// training set to learn </param> public override void learn(DataSet trainingSet) { int M = trainingSet.size(); int N = neuralNetwork.getLayerAt(0).NeuronsCount; Layer hopfieldLayer = neuralNetwork.getLayerAt(0); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (j == i) { continue; } Neuron ni = hopfieldLayer.getNeuronAt(i); Neuron nj = hopfieldLayer.getNeuronAt(j); Connection cij = nj.getConnectionFrom(ni); Connection cji = ni.getConnectionFrom(nj); double w = 0; for (int k = 0; k < M; k++) { DataSetRow trainingSetRow = trainingSet.getRowAt(k); double pki = trainingSetRow.Input[i]; double pkj = trainingSetRow.Input[j]; w = w + pki * pkj; } // k cij.Weight.Value = w; cji.Weight.Value = w; } // j } // i }
public static DataSetRow convertImageIntoData(string[] image) { DataSetRow dataSetRow = new DataSetRow(Data.CHAR_HEIGHT * Data.CHAR_WIDTH); double[] array = new double[Data.CHAR_WIDTH * Data.CHAR_HEIGHT]; for (int row = 0; row < Data.CHAR_HEIGHT; row++) { for (int column = 0; column < Data.CHAR_WIDTH; column++) { int index = (row * Data.CHAR_WIDTH) + column; char ch = image[row][column]; array[index] = (ch == 'O' ? 1 : -1); } } dataSetRow.Input = array; return(dataSetRow); }