Демонстрация работы приложения для классификации цвета
В программе использовался один промежуточный слой, следует уточнить что веса нейронов были установлены в случайном порядке, сделан интервал [-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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!