Демонстрация работы приложения для классификации цвета



В программе использовался один промежуточный слой, следует уточнить что веса нейронов были установлены в случайном порядке, сделан интервал [-0.5,0.5], это делается для поиска лучших связей, если бы изначально был установлен вес -1 или 1 то это значение давало бы значительные погрешности, так как было бы найдено сразу граничное худшее или лучшее положение, в больших объемах данных для увеличения точности следует увеличить интервал, так повысится точность определения лучшего веса.Качественное изменение в точности определения конечного класса показанона таблице 4.

Таблица 4. Анализ точности нейронной сети, где 80% данных отводится под обучение

Количество строк данных Количество скрытых слоев Точность анализа Время в тиках
25 1 1 455829
5000 3 0,9860 60267025
5000 5 0,9830 76372936
40000 3 0,9935 482341466
40000 5 0,9939 602917713

 

На одинаковых объемах данных количество слоев повышает точность классификации незначительно или ухудшает результат в пределах 1%, вызывая большее количество погрешностей в распределении весов.

 

 

Заключение

В курсовом проекте было проведено изучение алгоритмов классификации. Реализованные приложения позволяют провести сравнительный анализ качества и времени работы на различных типах выборки.

В настоящее время крупные компании вкладывают большие средства (инвестиции доходят до 500 млн.долларов) в машинное обучение, потому что данная технология по-настоящему окупается. Через 5 лет это показатель может увеличиться в 10 раз.

С каждым годом большие данные становятся все более сложнее и человеку становится уже недостаточно своих аналитических способностей. Некоторые задачи перейдут к искусственному интеллекту, который справится с ними лучше и быстрее,чем человек.

 

 

Списоклитературы

1. Журавлев Ф. К. Упрощенный байесовский классификатор [Электронный ресурс]. – Режим доступа: https://habrahabr.ru/post/120194/ (Дата обращения 13.10.2017)

2. Лапко А. В., Ченцов С. В., Крохов С. И., Фельдман Л. А. Обучающиеся системы обработки информации и принятия решений. Непараметрический подход. — Новосибирск: Наука, 1996

3. Упрощенный байесовский классификатор [Электронный ресурс]. – Режим доступа http://alglib.sources.ru/dataanalysis/bayes.php.(Дата      обращения 13.12.2017).

4. БураковМ. В. Нейронные сети и нейроконтроллеры. Учеб. Пособие. СПб. ГУАП, 2013. – 284 с.

5. Алгоритмы Машинного обучения [Электронный ресурс].- Режим доступа:https://msdn.microsoft.com/ru-ru/magazine/mt149362?author=James%20McCaffrey

(Дата обращения 10.01.2018).

6. Козадаев. А. С. Техническая реализация искусственного нейрона иискусственной нейроннойсети [Электронный ресурс].- Режим доступа: https://cyberleninka.ru/article/n/tehnicheskaya-realizatsiya-iskusstvennogo-neyrona-i-iskusstvennoy-neyronnoy-seti (Дата обращения 12.03.2018)

 

 

Приложение 1

Отображение информации классификации упрощенного байеса.

 

Используемые методы в классификации наивного байесовского алгоритма на C#

staticintClassify(string occupation, string dominance, string height, int[][][] jointCounts, int[] dependentCounts, bool withSmoothing, int xClasses)

   {

double partProbMale = PartialProbability("мужчина", occupation, dominance, height, jointCounts, dependentCounts, withSmoothing, xClasses);

double partProbFemale = PartialProbability("женщина", occupation, dominance, height, jointCounts, dependentCounts, withSmoothing, xClasses);

double evidence = partProbMale + partProbFemale;

double probMale = partProbMale / evidence;

double probFemale = partProbFemale / evidence;

 

Console.WriteLine("Вероятномужчина = " + probMale.ToString("F4"));

Console.WriteLine("Вероятноженщина = " + probFemale.ToString("F4"));

if (probMale > probFemale) // возвращаемое значение вероятности пола

return 0;

else

return 1;

   }

staticint[][][] MakeJointCounts(string[] binnedData, string[] attributes, string[][] attributeValues)

{

// предполагается, хранимые данные - это занятие, доминантность, высота, пол

// result [] [] [] -> [attribute] [att value] [sex]

// ex: result [0] [3] [1] - подсчет (профессия) (технология) (женщина), то есть количество технологий & женщина

 

int[][][] jointCounts = newint[attributes.Length-1 ][][]; // -1 (безпола)

 

jointCounts[0] = newint[4][]; // 4 профессиональных сферы

       jointCounts[1] = newint[2][]; // 2 варианта доминирования: правша/левша

jointCounts[2] = newint[3][]; // 3 высоты

 

jointCounts[0][0] = newint[2]; // 2 поладляадминистративной

jointCounts[0][1] = newint[2]; // строительной

       jointCounts[0][2] = newint[2]; // образовательной

       jointCounts[0][3] = newint[2]; // технологическойсферы

 

       jointCounts[1][0] = newint[2]; // левша

       jointCounts[1][1] = newint[2]; // правша

 

       jointCounts[2][0] = newint[2]; // низкий

       jointCounts[2][1] = newint[2]; // средний

       jointCounts[2][2] = newint[2]; // высокий

 

for (int i = 0; i < binnedData.Length; ++i)

       {

string[] tokens = binnedData[i].Split(',');

int occupationIndex = AttributeValueToIndex(0, tokens[0]);

int dominanceIndex = AttributeValueToIndex(1, tokens[1]);

int heightIndex = AttributeValueToIndex(2, tokens[2]);

int sexIndex = AttributeValueToIndex(3, tokens[3]);

 

           ++jointCounts[0][occupationIndex][sexIndex]; // профессияипол (счетчик)

           ++jointCounts[1][dominanceIndex][sexIndex];

           ++jointCounts[2][heightIndex][sexIndex];

}

return jointCounts;

   }

staticint AttributeValueToIndex(int attribute, string attributeValue)

   {

if (attribute == 0)

       {

if (attributeValue == "административный") return 0;

elseif (attributeValue == "строительство") return 1;

elseif (attributeValue == "образование") return 2;

elseif (attributeValue == "технология") return 3;

       }

elseif (attribute == 1)

       {

if (attributeValue == "левша") return 0;

elseif (attributeValue == "правша") return 1;

       }

elseif (attribute == 2)

       {

if (attributeValue == "низкий") return 0;

elseif (attributeValue == "средний") return 1;

elseif (attributeValue == "высокий") return 2;

       }

elseif (attribute == 3)

       {

if (attributeValue == "мужчина") return 0;

elseif (attributeValue == "женщина") return 1;

}

return -1; // ошибка

   }

staticint[] MakeDependentCounts(int[][][] jointCounts, int numDependents)

   {

int[] result = newint[numDependents];

for (int k = 0; k < numDependents; ++k) 

for (int j = 0; j < jointCounts[0].Length; ++j)

               result[k] += jointCounts[0][j][k];

return result;

   }

 

 

 

Приложение 2

Отображение информации классификации нейронной сети.

 

 

Используемые методы в классификации цвета при помощи нейронной сети на C#

staticvoid MakeData(string dataFile, int numLines)

   {

double[] weights = newdouble[] { -0.1, 0.2, -0.3, 0.4, -0.5,

                                   0.6, -0.7, 0.8, -0.9, 1.0,

                                   -1.1, 1.2, -1.3, 1.4, -1.5,

                                   1.6, -1.7, 1.8, -1.9, 2.0,

                                   -0.5, 0.6, -0.7, 0.8, -0.9,

                                   1.5, -1.4, 1.3,

                                   -1.2, 1.1, -1.0,

                                   0.9, -0.8, 0.7,

                                   -0.6, 0.5, -0.4,

                                   0.3, -0.2, 0.1,

                                   0.1, -0.3, 0.6 };

 

       NeuralNetwork nn = new NeuralNetwork(4, 5, 3);

       nn.SetWeights(weights);

 

       FileStream ofs = new FileStream(dataFile, FileMode.Create);

       StreamWriter sw = new StreamWriter(ofs);

 

for (int i = 0; i < numLines; ++i)

       {

double[] inputs = newdouble[4];

for (int j = 0; j < inputs.Length; ++j)

               inputs[j] = rnd.Next(1, 10);

 

double[] outputs = nn.ComputeOutputs(inputs);

 

string color = "";

int idx = Helpers.IndexOfLargest(outputs);

if (idx == 0) { color = "красный"; }

elseif (idx == 1) { color = "зеленый"; }

elseif (idx == 2) { color = "синий"; }

 

           sw.WriteLine(inputs[0].ToString("F1") + " " + inputs[1].ToString("F1") + " " + inputs[2].ToString("F1") + " " + inputs[3].ToString("F1") + " " + color);

}

       sw.Close(); ofs.Close();

 

   }

staticvoid MakeTrainAndTest(string file, outdouble[][] trainMatrix, outdouble[][] testMatrix)

   {

int numLines = 0;

       FileStream ifs = new FileStream(file, FileMode.Open);

       StreamReader sr = new StreamReader(ifs);

while (sr.ReadLine() != null)

           ++numLines;

       sr.Close(); ifs.Close();

 

int numTrain = (int)(0.80 * numLines);

int numTest = numLines - numTrain;

 

double[][] allData = newdouble[numLines][];

for (int i = 0; i < allData.Length; ++i)

           allData[i] = newdouble[7];          // (x0, x1, x2, x3), (y0, y1, y2) //4 входных 3 выходных

 

string line = "";

string[] tokens = null;

       ifs = new FileStream(file, FileMode.Open);

       sr = new StreamReader(ifs);

int row = 0;

while ((line = sr.ReadLine()) != null)

       {

           tokens = line.Split(' ');

           allData[row][0] = double.Parse(tokens[0]);

           allData[row][1] = double.Parse(tokens[1]);

           allData[row][2] = double.Parse(tokens[2]);

           allData[row][3] = double.Parse(tokens[3]);

 

for (int i = 0; i < 4; ++i)

               allData[row][i] = 0.25 * allData[row][i] - 1.25; // масштабирование [-1.0, +1.0]

 

if (tokens[4] == "красный") { allData[row][4] = 1.0; allData[row][5] = 0.0; allData[row][6] = 0.0; }

elseif (tokens[4] == "зеленый") { allData[row][4] = 0.0; allData[row][5] = 1.0; allData[row][6] = 0.0; }

elseif (tokens[4] == "синий") { allData[row][4] = 0.0; allData[row][5] = 0.0; allData[row][6] = 1.0; }

           ++row;

       }

       sr.Close(); ifs.Close();

 

       Helpers.ShuffleRows(allData);

 

       trainMatrix = Helpers.MakeMatrix(numTrain, 7);

       testMatrix = Helpers.MakeMatrix(numTest, 7);

 

for (int i = 0; i < numTrain; ++i)

       {

           allData[i].CopyTo(trainMatrix[i], 0);

       }

 

for (int i = 0; i < numTest; ++i)

       {

           allData[i + numTrain].CopyTo(testMatrix[i], 0);

}

   }

classNeuralNetwork

{

privateint numInput;

privateint numHidden;

privateint numOutput;

 

privatedouble[] inputs;

privatedouble[][] ihWeights; // входныевскрытые

privatedouble[] ihSums;

privatedouble[] ihBiases;

privatedouble[] ihOutputs;

privatedouble[][] hoWeights; // скрытыеввыходные

privatedouble[] hoSums;

privatedouble[] hoBiases;

privatedouble[] outputs;

 

static Random rnd = null;

 

public NeuralNetwork(int numInput, int numHidden, int numOutput)

   {

this.numInput = numInput;

this.numHidden = numHidden;

this.numOutput = numOutput;

 

       inputs = newdouble[numInput];

       ihWeights = Helpers.MakeMatrix(numInput, numHidden);

       ihSums = newdouble[numHidden];

       ihBiases = newdouble[numHidden];

       ihOutputs = newdouble[numHidden];

       hoWeights = Helpers.MakeMatrix(numHidden, numOutput);

       hoSums = newdouble[numOutput];

       hoBiases = newdouble[numOutput];

       outputs = newdouble[numOutput];

 

       rnd = new Random(0);

   }

 

publicvoid SetWeights(double[] weights)

   {

int numWeights = (numInput * numHidden) + (numHidden * numOutput) + numHidden + numOutput;

if (weights.Length != numWeights)

thrownew Exception("Длинамассивавесов: " + weights.Length + " несоответствуетобщемуколичествувесовисмещений: " + numWeights);

 

int k = 0; // указание на весовые параметры

 

for (int i = 0; i < numInput; ++i)

for (int j = 0; j < numHidden; ++j)

               ihWeights[i][j] = weights[k++];

 

for (int i = 0; i < numHidden; ++i)

           ihBiases[i] = weights[k++];

 

for (int i = 0; i < numHidden; ++i)

for (int j = 0; j < numOutput; ++j)

               hoWeights[i][j] = weights[k++];

 

for (int i = 0; i < numOutput; ++i)

hoBiases[i] = weights[k++];

   }

publicdouble[] Train(double[][] trainMatrix) // искатьивозвращатьлучшиевеса

   {

int numWeights = (this.numInput * this.numHidden) + (this.numHidden * this.numOutput) + this.numHidden + this.numOutput;

//double[] currWeights = new double[numWeights];

 

// PSO для нахождения лучших весов

int numberParticles = 10;

int numberIterations = 500;

int iteration = 0;

int Dim = numWeights; // числорешенийсучетомвсехвесов

double minX = -5.0;

double maxX = 5.0;

 

       Particle[] swarm = new Particle[numberParticles];

double[] bestGlobalPosition = newdouble[Dim]; //лучшее решение, найденное любой частицей в рое, неявная инициализация для всех 0.0

double bestGlobalFitness = double.MaxValue; // меньшиезначениялучше

 

double minV = -0.1 * maxX; // скорость

double maxV = 0.1 * maxX;

 

for (int i = 0; i < swarm.Length; ++i) //инициализировать каждую частицу в рое со случайными позициями и скоростями

{

double[] randomPosition = newdouble[Dim];

for (int j = 0; j < randomPosition.Length; ++j)

           {

double lo = minX;

double hi = maxX;

               randomPosition[j] = (hi - lo) * rnd.NextDouble() + lo;

           }

 

double fitness = CrossEntropy(trainMatrix, randomPosition); // меньшезначениелучше

double[] randomVelocity = newdouble[Dim];

 

for (int j = 0; j < randomVelocity.Length; ++j)

           {

double lo = -1.0 * Math.Abs(maxX - minX);

double hi = Math.Abs(maxX - minX);

               randomVelocity[j] = (hi - lo) * rnd.NextDouble() + lo;

           }

           swarm[i] = new Particle(randomPosition, fitness, randomVelocity, randomPosition, fitness);

 

// действительно ли текущая частица имеет глобальное лучшее положение?

if (swarm[i].fitness < bestGlobalFitness)

           {

               bestGlobalFitness = swarm[i].fitness;

               swarm[i].position.CopyTo(bestGlobalPosition, 0);

}

       }

 

double w = 0.729; // инерционный вес

double c1 = 1.49445; // когнитивный / местный вес

double c2 = 1.49445; // социальный / глобальный вес

double r1, r2; // когнитивные и социальные рандомизации

 

       Console.WriteLine("Вход в основной цикл обработки оценки PSO");

while (iteration < numberIterations)

       {

           ++iteration;

double[] newVelocity = newdouble[Dim];

double[] newPosition = newdouble[Dim];

double newFitness;

 

for (int i = 0; i < swarm.Length; ++i) // каждаячастица

           {

               Particle currP = swarm[i];

 

for (int j = 0; j < currP.velocity.Length; ++j) // каждоезначение x скорости

               {

                   r1 = rnd.NextDouble();

                   r2 = rnd.NextDouble();

 

                   newVelocity[j] = (w * currP.velocity[j]) +

                     (c1 * r1 * (currP.bestPosition[j] - currP.position[j])) +

(c2 * r2 * (bestGlobalPosition[j] - currP.position[j])); //новая скорость зависит от старой скорости, лучшего положения частицы и наилучшего положения любой частицы

 

if (newVelocity[j] < minV)

                       newVelocity[j] = minV;

elseif (newVelocity[j] > maxV)

newVelocity[j] = maxV; // сохранение скорости в радиусе действия

}

 

               newVelocity.CopyTo(currP.velocity, 0);

 

for (int j = 0; j < currP.position.Length; ++j)

               {

                   newPosition[j] = currP.position[j] + newVelocity[j]; // вычислениеновойпозиции

if (newPosition[j] < minX)

                       newPosition[j] = minX;

elseif (newPosition[j] > maxX)

                       newPosition[j] = maxX;

               }

 

               newPosition.CopyTo(currP.position, 0);

 

               newFitness = CrossEntropy(trainMatrix, newPosition); // вычислениекроссэнтропийнойошибкиположениячастицы

               currP.fitness = newFitness;

 

if (newFitness < currP.bestFitness) // новоеположениечастицылучше?

               {

                   newPosition.CopyTo(currP.bestPosition, 0);

                   currP.bestFitness = newFitness;

               }

 

if (newFitness < bestGlobalFitness) // новоеглобальноеположение?

               {

                   newPosition.CopyTo(bestGlobalPosition, 0);

                   bestGlobalFitness = newFitness;

               }

 

           }

 

//Console.WriteLine(swarm[0].ToString());

//Console.ReadLine();

 

       }

 

       Console.Write("кросс-энтропийнаяошибка = ");

       Console.WriteLine(bestGlobalFitness.ToString("F4"));

 

return bestGlobalPosition;

}


Дата добавления: 2018-05-01; просмотров: 101; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!