JavaRush /Java Blog /Random-TL /Machine Learning para sa Mga Developer ng Java, Bahagi 1

Machine Learning para sa Mga Developer ng Java, Bahagi 1

Nai-publish sa grupo
Mag-set up ng machine learning algorithm at bumuo ng iyong unang predictive function gamit ang Java. Ang mga self-driving na kotse, facial recognition system, at voice assistant ay binuo gamit ang mga teknolohiya at framework ng machine learning. At ito ay unang alon lamang. Sa susunod na 10 taon, isang bagong henerasyon ng mga produkto ang magpapabago sa ating mundo, na magbibigay ng mga bagong diskarte sa pagbuo ng mga programa, produkto at aplikasyon. Машинное обучение для Java-разработчиков, часть 1 - 1Bilang isang Java programmer, gusto mong mahuli ang wave na ito ngayon na ang mga tech na kumpanya ay nagsisimula nang mamuhunan nang malaki sa machine learning. Ang natutunan mo ngayon ay magagamit mo sa susunod na limang taon. Ngunit saan magsisimula? Ang artikulong ito ay naglalayong sagutin ang tanong na ito. Makakakuha ka ng unang impression sa mga prinsipyo ng machine learning sa pamamagitan ng pagsunod sa aming maikling gabay sa pagpapatupad at paghahanda ng machine learning algorithm. Pagkatapos matutunan ang tungkol sa istruktura ng isang algorithm sa pag-aaral at ang mga tampok na magagamit mo upang sanayin ito, suriin ito, at piliin ang function na nagbibigay ng pinakamahusay na katumpakan ng hula, magkakaroon ka ng pag-unawa sa kung paano gamitin ang JVM framework (Weka) upang bumuo ng mga solusyon sa pag-aaral ng makina. Nakatuon ang artikulong ito sa pinangangasiwaang machine learning dahil ito ang prinsipyong pinakakaraniwang ginagamit sa pagbuo ng mga smart application.

Machine learning at artificial intelligence

Nag-evolve ang machine learning mula sa larangan ng artificial intelligence, na naglalayong lumikha ng mga makina na maaaring gayahin ang katalinuhan ng tao. Bagama't nagmula ang terminong "machine learning" sa computer science, ang artificial intelligence ay hindi isang bagong larangan ng agham. Ang Turing test , na binuo ng mathematician na si Alan Turing noong unang bahagi ng limampu ng ika-20 siglo, ay isa sa mga unang pagsubok na idinisenyo upang matukoy kung ang isang computing machine ay may tunay na katalinuhan. Ayon sa Turing test, pinatutunayan ng isang computing machine ang pagkakaroon ng katalinuhan ng tao sa pamamagitan ng pagpapanggap bilang isang tao nang hindi napagtatanto ng huli na nakikipag-usap siya sa makina.
Машинное обучение для Java-разработчиков, часть 1 - 2
Maraming sikat na machine learning approach ngayon ang nakabatay sa mga ideya na ilang dekada na. Ngunit ang huling dekada sa computing (at mga distributed computing platform) ay nagdala ng sapat na kapangyarihan upang maglapat ng mga algorithm ng machine learning. Karamihan sa kanila ay nangangailangan ng malaking halaga ng matrix multiplication at iba pang mathematical calculations. Dalawampung taon na ang nakalilipas, ang mga teknolohiya sa pag-compute na magpapahintulot sa gayong mga kalkulasyon ay hindi umiiral, ngunit ngayon ay naging isang katotohanan. Binibigyang-daan ng mga algorithm ng machine learning ang mga programa na isagawa ang proseso ng pagpapahusay ng kalidad at palawakin ang kanilang mga kakayahan nang walang interbensyon ng tao. Ang isang program na binuo gamit ang machine learning ay nakapag-iisa na makapag-update o nagpapalawak ng sarili nitong code.

Контролируемое обучение vs неконтролируемое обучение

Контролируемое и неконтролируемое обучение являются двумя наиболее популярными подходами к машинному обучению. Для обоих вариантов необходимо давать машине огромное количество записей данных для построения соотношений и обучения. Такие собранные данные обычно называют «вектором признаков». Например, у нас есть некий жилой дом. В таком случае вектор признаков может содержать такие признаки, How: общая площадь дома, количество комнат, год постройки дома и так далее. При контролируемом обучении, алгоритм машинного обучения подготавливается для ответа на вопросы, связанные с векторами признаков. Для тренировки алгоритма, ему «скармливают» набор векторов признаков и связанных меток. Связанную метку предоставляет человек (учитель), и она содержит правильный «ответ» на заданный вопрос. Алгоритм обучения анализирует векторы признаков и правильные метки для поиска внутренней структуры и взаимоотношений между ними. Таким образом машина учится правильно отвечать на вопросы. В качестве примера можно рассмотреть некое интеллектуальное приложение для торговли недвижимостью. Его можно натренировать с помощью вектора признаков, включающего размер, количество комнат, и год постройки для набора домов. Человек должен присвоить каждому дому метку с правильной ценой дома, базируясь на этих факторах. Анализируя эти данные, умное приложение должно натренироваться, чтобы ответить на вопрос «Сколько денег я смогу получить за этот дом?».
Интересно читать о Java? Вступайте в группу Java Developer!
После того How процесс подготовки закончен, новые входные данные уже больше не маркируются. Машина должна быть способна правильно отвечать на вопросы, даже для не известных, не промаркированных векторов признаков. При неконтролируемом обучении, алгоритм строится таким образом чтобы предсказывать ответы без маркировки человеком (or даже без вопросов). Вместо определения маркировки or результата, алгоритмы неконтролируемого обучения используют большие массивы данных и вычислительные мощности для выявления ранее не известных взаимоотношений. Например, в маркетинге потребительских продуктов можно использовать неконтролируемое обучение для определения скрытых взаимосвязей or группирования клиентов, что в конце концов поможет усовершенствовать маркетинговую программу or создать новую. В этой статье мы сосредоточимся на контролируемом машинном обучении; в настоящее время этот подход используется чаще всего.

Контролируемое машинное обучение

Любое машинное обучение базируется на данных. Для проекта по контролируемому машинному обучению,нужно отметить маркерами данные таким образом, чтобы получить осмысленные ответы на задаваемый вопрос. Ниже, в Таблице-1, каждая запись информации о доме имеет метку «цена дома». Выявляя взаимосвязь между данными записей и ценой дома, алгоритм в итоге должен быть способным предсказать рыночную цену для домов не входящих в данный список. (Обратите внимание, площадь дома указана в квадратных метрах, а стоимость дома в евро).
Таблица 1. Список домов
Признак Признак Признак Метка
Площадь дома Количество комнат Возраст дома Ожидаемая цена дома
90 m2 / 295 ft 2 Комнаты 23 года 249,000 €
101 m2 / 331 ft 3 Комнаты n/a 338,000 €
1330 m2 / 4363 ft 11 комнат 12 лет 6,500,000 €
На ранних этапах вы, скорее всего, будете маркировать данные вручную, но в конце концов вы научите вашу программу делать это самостоятельно. Вы, вероятно, уже видели How работает такой подход с клиентами электронной почты, когда для перемещения письма в папку «Спам» вы отвечаете на вопрос «Является ли это письмо не желательным?». Когда вы отвечаете, вы обучаете программу распознавать письма, которые вы не хотите видеть. Спам-фильтр applications обучается маркировать письма из того же источника, or содержащее такой же контент и управлять ими согласно соответствующим правилам. Маркированные наборы данных необходимы только для подготовки и тестирования. После того How этот этап окончен, алгоритм машинного обучения работает с немаркированными данными. К примеру, вы можете подать в алгоритм предсказания новую немаркированную запись данных о доме и он должен автоматически предсказать ожидаемую цену дома базируясь на «знаниях» полученных из подготовительных данных.

Как машина обучается предсказывать

Сложность контролируемого машинного обучения -- в поиске подходящей функции предсказания для определенного вопроса. Математически сложность состоит в том чтобы найти функцию которая получает на вход переменную х и возвращает предсказанное meaning у. Эта функция гипотез (hθ) является результатом процесса подготовки. Часто функция гипотез также называется целевой функцией or функцией предсказания.
y = hθ (x)
В большинстве случаев, х представляет собой массив данных. В нашем примере -- это двухмерный массив из элементов, определяющих дом, состоящий из количества комнат и площади дома. Массив таких значений является вектором признаков. Задав конкретную целевую функцию, мы можем использовать её для предсказания каждого вектора признаков х. Whatбы предсказать цену дома, вы должны вызвать целевую функцию используя вектор признаков {101.0, 3.0}, состоящий из площади дома и количества комнат:
// целевая функция h (результат процесса обучения)
Function<Double[], Double> h = ...;

// определяем целевой вектор с площадью дома=101 и количеством комнат=3
Double[] x = new Double[] { 101.0, 3.0 };

// и предсказываем цену дома (метка)
double y = h.apply(x);
В исходном codeе из примера-1, значения в массиве х представляют вектор признаков дома. Значение у, возвращаемое целевой функцией, -- это предсказанная цена дома. Целью машинного обучения является определение целевой функции, которая будет работать максимально точно при неизвестных входных параметров. В машинном обучении, целевая функция (hθ) иногда называется моделью. Эта модель является результатом процесса обучения.
Машинное обучение для Java-разработчиков, часть 1 - 3
Базируясь на маркированных тренировочных образцах, алгоритм обучения ищет структуры or шаблоны в тренировочных данных. Таким образом, он строит модель которая в целом хороша для этих данных. Как правило, процесс обучения носит исследовательский характер. В большинстве случае процесс повторяют многократно с использованием разных вариантов алгоритмов обучения и конфигураций. В итоге все модели оцениваются на основе метрик производительности, среди которых выбирается лучшая. И эта модель используется для вычисления предполагаемых значений для будущих не маркированных данных.

Линейная регрессия

Whatбы научить машину «думать», сначала нужно выбрать алгоритм обучения, который вы будете использовать. Например, линейную регрессию. Это – один из простейших и самых популярных алгоритмов контролируемого машинного обучения. Алгоритм предполагает что отношение между входными признаками и маркерами результата – линейно. Общая функция линейной регрессии, приведенная ниже, возвращает предсказанное meaning путем суммирования всех элементов вектора признаков умноженных на параметр θ (тета). Этот параметр используется в процессе обучения для адаптации or «подстройки» функции регрессии на основе тренировочных данных.
hθ (x) = θ0 * 1 + θ1 * x1 + ... θn * xn
В функции линейной регрессии параметр тета и параметры признаков пронумерованы подстрочными индексами. Подстрочный индекс определяет позицию параметра (θ) и параметра признака (х) в векторе. Обратите внимание, что признак x0 является постоянным элементом сдвига и имеет meaning 1 для вычислительных целях. В результате индекс значимых параметров таких, How площадь дома, начинается с x1. Так, если x1 присвоено первое meaning вектора признаков (площадь дома), то x2 будет принимать следующее meaning (количество комнат) и так далее. Пример-2 демонстрирует Java-реализацию функции линейной регрессии, математически обозначаемой How hθ(x). Для простоты, вычисления выполняются с использованием типа данных double. В методе apply(), предусмотрено, что первый элемент массива будет equals 1.0 и будет установлен за пределами этой функции. Пример 2. Линейная регрессия на Java
public class LinearRegressionFunction implements Function<Double[], Double> {
 private final double[] thetaVector;

 LinearRegressionFunction(double[] thetaVector) {
 this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length);
 }

 public Double apply(Double[] featureVector) {
 // с целью упрощения вычислений первый элемент должен быть equals 1.0
 assert featureVector[0] == 1.0;

 // простое последовательное сложение
 double prediction = 0;
 for (int j = 0; j < thetaVector.length; j++) {
 prediction += thetaVector[j] * featureVector[j];
 }
 return prediction;
 }

 public double[] getThetas() {
 return Arrays.copyOf(thetaVector, thetaVector.length);
 }
}
Whatбы создать новый экземпляр LinearRegressionFunction, нужно задать параметр θ. Этот параметр or вектор используется для адаптации общей функции линейной регрессии к лежащим в основе тренировочных данных. Параметр θ, используемый в программе, будет настроен в процессе обучения, базируясь на тренировочных примерах. Качество обученной целевой функции будет зависеть от качества подготовленных для обучения данных. В примере ниже мы используем LinearRegressionFunction для иллюстрации предсказания цены, базируясь на размере дома. Принимая во внимание то, что x0 должен быть константой со meaningм 1.0, целевая функция инициализируется, используя два параметра θ, при этом они являются результатом процесса обучения. После создания нового примера, цена дома площадью 1330 квадратных метров будет предсказываться How показано ниже:
// тета вектор, используемый в этом примере, является результатом процесса обучения
double[] thetaVector = new double[] { 1.004579, 5.286822 };
LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector);

// создание вектора признаков со значениями x0=1 (для удобства вычислений) и //x1=площадь дома
Double[] featureVector = new Double[] { 1.0, 1330.0 };

// выполняем расчеты
double predictedPrice = targetFunction.apply(featureVector);
На рисунке ниже вы можете видеть график целевой функции предсказаний (синяя линия). Он получен путем вычисления целевой функции для всех значений площади дома. График также содержит пары цена-площадь, используемые для обучения.
Машинное обучение для Java-разработчиков, часть 1 - 4
Now график предсказаний выглядит достаточно хорошо. Координаты графика (положение и наклон) определяются вектором θ { 1.004579, 5.286822 }. Но How определить, что именно этот θ-вектор лучше всего подходит для вашего применения? Будет ли функция соответствовать лучше, если вы измените первый or может быть второй параметр? Для определения наиболее подходящего тета вектора вам нужна функция полезности, которая будет оценивать насколько хорошо целевая функция справляется с этой задачей. ПРОДОЛЖЕНИЕ СЛЕДУЕТ Перевод с английского. Author — Грегор Рот (Gregor Roth), Software Architect, JavaWorld.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION