Давайте временно обновим эту серию статей о машинном обучении вручную. В настоящее время завершена поддержка векторной машины SVM, дерева решений, KNN, байесовской, линейной регрессии и логистической регрессии. Для других алгоритмов, пожалуйста, позвольте Taoye отдать должное здесь сначала Позже будет время наверстать упущенное.
Это обновление также получило положительные отзывы от некоторых читателей. Хотя это не так много, я очень благодарен за вашу поддержку, и я надеюсь, что каждый читатель, прочитавший его, сможет что-то почерпнуть.
Все содержание этой серии статей написано Таойе исключительно от руки.Также есть отсылки ко многим книгам и общедоступным ресурсам.Общее количество слов в серии около 15W (включая исходный код), которые будут заполнены позже.Подробнее технические статьи могут посетить общественность Taoye.Циничный кодер. Документ можно распространять свободно, но будьте осторожны, не изменяйте его содержание.
Если в статье есть какие-либо вопросы, которые вы не понимаете, вы можете задать их напрямую, и Taoye ответит, как только они ее увидят.В то же время каждый может прийти сюда, чтобы напомнить Taoye в частном порядке:Циничный кодер, в официальном аккаунте также есть личная контактная информация Таое. Несколько слов, Таойе может говорить с тобой тайно только там (#`О')
Чтобы улучшить опыт чтения для всех, серия статей Taoye по машинному обучению была организована в видеPDF и HTML, эффект чтения очень хороший,Ответьте на [666] под официальным аккаунтом [Cynical Coder], чтобы получить его бесплатно.
Цикл статей об алгоритмах машинного обучения с отрывом от руки сильно исчерпан, и я чувствую, что качество неплохое. В настоящее время были обновлены метод опорных векторов SVM, дерево решений, K-ближайший сосед (KNN) и байесовская классификация. Читатели могут «заряжать» в соответствии со следующим содержанием (постоянно обновляется):
- «Машинное обучение в действии» — анализ машин опорных векторов, разрыв линейного SVM одной рукой:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — анализ машин опорных векторов и оптимизация SMO:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — тот, кто понимает, понимает, а тот, кто не понимает, понимает. Нелинейные машины опорных векторов:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — Taoye расскажет, что за «призрак» представляет собой дерево решений:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — дети, идите и играйте, дерево решений:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — одноклассница спросила Таое, как следует играть KNN, чтобы пройти уровень.:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — байесовский диалект:Woohoo Только tribal.com/Tian Punishment Plus…
- «Машинное обучение в действии» — рассказ о линейной регрессии.:Woohoo Только tribal.com/Tian Punishment Plus…
Читатели, прочитавшие приведенные выше статьи, должны знать, что приведенный выше контент относится к алгоритмам классификации, а целевыми переменными классификации являются номинальные данные (о значении номинальных данных и данных данных см. выше). Основное содержание этой статьи — линейная регрессия, которая представляет собой задачу подбора регрессии, которая делает прогнозы на непрерывных данных, а не оценивает, к какому классу принадлежит выборка.
Эта статья в основном включает следующие части:
- Линейная регрессия, давайте поговорим о том, как у дамы и сестры свидание вслепую
- Демистификация алгоритма градиентного спуска
- Подгонка линейной регрессии на основе алгоритма градиентного спуска
1. Линейная регрессия, давайте поговорим о том, как у мисс и сестры свидание вслепую
Предсказание регрессии, предсказание регрессии, в конечном счете, включает в себя две части.
Один - регрессия (подгонка), а другой - предсказание. Регрессия заключается в подготовке или прокладке пути для прогнозирования.Только на основе существующего набора данных мы можем построить регрессионную модель, а затем процесс обработки новых выборочных данных в соответствии с этой регрессионной моделью является прогнозированием.
Линейная регрессия означает, что наша регрессионная модель является линейной, то есть каждая атрибутивная функция нашей выборки встречается не более одного раза (читатели, которые заходят, должны это знать).
Чтобы дать читателям базовое представление о линейной регрессии, давайте поговорим о свидании вслепую мисс Сестра.
История выглядит так.
Давным-давно жила-была барышня, которая планировала пойти на свидание вслепую.Ее больше беспокоила зарплата ее партнера, но она была слишком смущена, чтобы сразу перейти к теме такого рода вещей, не надо ты думаешь? Итак, она подумала о том, чтобы предсказать зарплату через атрибуты самого объекта для свиданий вслепую. Предположим, барышня считает, что зарплата объекта в основном состоит из двух частей данных, а именно возраста объекта и объема волос. В связи с этим Miss Sister хочет построить такую линейную модель о зарплате:
Описание на китайском:
Итак, цель Мисс Сестры теперь состоит в том, чтобы получить такуюЗначение , а затем наблюдайте и спрашивайте об объеме волос и возрасте свидания вслепую, а затем можно рассчитать зарплату свидания вслепую на основе этой линейной модели.
Итак, как получитьценность? ? ? Как раз в тот момент, когда мозг Мисс Сестры заболел, Таойе пожала руку, чтобы научить Мисс Сестричку: «Мисс, вы можете сначала провести слепое свидание с 1000 объектов, понаблюдать и узнать объем волос и возраст объектов, а затем пройти через социальную инженерию, чтобы получить его зарплата.С помощью этих 1000 наборов объектных данных вы можете обучать, чтобы получить эту линейную модель, когда ошибка минимизируется»
Выслушав замечания Таоэ, Мисс Сестра действительно разбудила мечтательницу одним предложением, подумав про себя: Чудесно, просто сделай это! ! !
Содержимое приведенного выше примера является чисто чепухой Таоя, предназначенной только для описания процесса линейной регрессии и не представляющей никакой точки зрения.
2. Демистификация алгоритма градиентного спуска
Из истории свидания вслепую мисс Сестры, приведенной выше, я полагаю, что все официальные лица имеют базовое понимание процесса линейной регрессии, и для работы с линейной регрессией в частности нам также необходимо понять алгоритм, который более важен в области машин. обучения, то есть алгоритм градиентного спуска.
Чтобы понять алгоритм градиентного спуска, мы можем сравнить его с процессом спуска человека с горы, который также является наиболее часто используемым примером, когда мы понимаем алгоритм градиентного спуска, который представляет собой такую сцену:
Человек застрял на горе, и все, что ему сейчас нужно сделать, это спуститься с горы, то есть достичь самой низкой точки горы. Однако сейчас вся гора задымлена и видимость очень низкая, поэтому путь вниз с горы определить пока нельзя.Он должен найти путь вниз с горы шаг за шагом, используя некоторую информацию о том, где он находится в данный момент. . На данный момент пришло время алгоритму градиентного спуска показать свои таланты. Как это сделать?
Это так: во-первых, он будет использовать свое текущее местоположение в качестве точки отсчета, чтобы найти текущее местоположение.самый крутой, а затем сделайте шаг в нисходящем направлении в соответствии с собственными настройками. Сделав один шаг, вы придете к новой позиции, а затем используйте эту новую позицию как ориентир, найдите самое крутое место, сделайте еще один шаг в этом направлении, и так далее, и так далее, пока не достигнете самой низкой точки. Это процесс классификации алгоритма градиентного спуска, и то же самое верно для подъема в гору, но он становится алгоритмом градиентного восхождения.
Основной процесс алгоритма градиентного спуска аналогичен вышеупомянутой сцене спуска.
Во-первых, у нас будет дифференцируемая функция. Эта функция похожа на гору выше. Наша цель — найти минимум этой функции, который является самой низкой точкой Чжуншаня выше. Согласно предположению предыдущего сценария, самый быстрый способ спуститься с горы - это найти самое крутое направление текущего положения, а затем спуститься в этом направлении.В этой дифференцируемой функции противоположное направление градиента представляет самое крутое направление гора, то есть направление, в котором функция убывает быстрее всего. Поскольку направление градиента — это направление, в котором функция изменяется быстрее всего (подробно будет объяснено позже).
Поэтому мы повторно используем этот метод, после достижения новой позиции мы повторно получаем градиент, и, наконец, мы можем достичь локального минимального значения, что аналогично процессу спуска с горы. И нахождение градиента определяет самое крутое направление, которое является средством измерения направления в сцене. Так почему же направление градиента является самым крутым? Далее начнем с дифференцирования:
- Одномерный
Для одномерного дифференцирования, поскольку функция имеет только одну переменную, градиент в это время является производной функции, а представленное значение представляет собой наклон, соответствующий этой точке.
- Многомерный (в качестве примера возьмем три переменные)
Для многомерных функций градиент в это время уже не конкретная величина, а вектор. мы все знаем,Вектор имеет направление, а направление градиента представляет собой направление, в котором функция возрастает быстрее всего в указанной точке.
Это также объясняет, почему нам нужно сделать все возможное, чтобы найти градиент! Нам нужно достичь подножия горы, и нам нужно наблюдать за самым крутым местом в это время на каждом шагу, а уклон подсказывает нам это направление. Направление градиента — это направление, в котором функция быстрее всего возрастает в данной точке, тогда противоположное направление градиента — это направление, в котором функция быстрее всего падает в данной точке, что нам и нужно. Итак, пока мы продолжаем двигаться в направлении градиента, мы можем достичь локального минимума!
Теперь мы могли бы смоделировать этот процесс с помощью кода. Предположим, наша текущая целевая функция:
Тогда его соответствующий градиент:
В связи с этим мы можем смоделировать процесс градиентного спуска с помощью следующего кода, чтобы найти время, когда будет достигнута самая нижняя точка.ценность:
С помощью приведенного выше кода мы можем обнаружить, что когда значение функции достигает самой низкой точки, наша, с нашим рассчитанным вручнуюПо сути, вы можете нарисовать знак равенства, и это проблема, которую решает градиентный спуск.
Для приведенного выше кода здесь мы в основном говорим о двух моментах:
①:x_new = x_old - learning_rate * gradient(x_old)
При обновлении x_new во время прямого процесса это делается через x_old Причина, по которой знак минус добавляется перед градиентом, в основном состоит в том, чтобы двигаться в направлении, противоположном градиенту. Мы также упоминали ранее, что противоположное направление градиента — это направление, в котором функция падает быстрее всего в этой точке. Тогда, если это в гору, то есть алгоритм градиентного восхождения, в это время процессу обновления x_new не нужно добавлять отрицательный знак.
Что касается того, когда происходит градиентный подъем и когда градиентный спуск, это определяется в зависимости от того, ищем ли мы минимальное значение или максимальное значение в нашей реальной ситуации.
②:learning_rate
learning_rate
Известная как скорость обучения или размер шага в алгоритме градиентного спуска, это означает, что мы можем пройтиlearning_rate
На самом деле, чтобы контролировать расстояние каждого шага, не двигайтесь слишком быстро и не пропускайте самую низкую точку. В то же время мы также должны следить за тем, чтобы мы не шли слишком медленно, чтобы нам потребовалось много времени, чтобы достичь самой низкой точки, то есть эффективность была слишком низкой, и для достижения нашей цели требуется много итераций. потребности. такlearning_rate
Выбор часто важен в градиентном спуске!
Нужен разумный выборlearning_rate
Обычно это значение равно 0,01, и необходимо детально проанализировать конкретные проблемы.
В целом, алгоритм градиентного спуска в основном обновляет и повторяет значение x в соответствии с градиентом функции, чтобы получить значение x, когда функция достигает минимального значения.
Разумеется, приведенное выше является общей формой алгоритма, и исследователи также предложили несколько вариантов алгоритма градиентного спуска, в основном следующие три. :
- Алгоритм стохастического градиентного спуска (SGD, с точки зрения временной сложности)
- Алгоритм пакетного градиентного спуска (BGD, в зависимости от размера данных)
- Мини-пакетный градиентный спуск (MBGD, точность алгоритма)
Что касается вариантов вышеприведенных трех алгоритмов градиентного спуска, здесь мы копаем дыру, и позже у нас будет возможность медленно заполнить дыру.
3. Аппроксимация линейной регрессии на основе алгоритма градиентного спуска.
Если здесь действительно используется код, то он на самом деле предполагает понимание нейронной сети.Однако мы не будем здесь заострять внимание на объяснении содержания нейронной сети.Мы лишь кратко упомянем о нем.После череды отрывающих руки машинного обучения статьи завершены, мы рассмотрим его подробно.
Ссылка: «Глубокое обучение TensorFlow» - Учитель Лонг Лонг
Все мы знаем, что человеческий мозг содержит большое количество нейронных клеток, каждый нейрон получает входные сигналы через дендриты, а затем передает и выводит сигналы через аксоны, причем нейроны связаны друг с другом так, что составляют огромную нейронную сеть. Структура биологического нейрона показана на следующем рисунке:
В 1943 году психолог Уоррен МакКаллох (Warren McCulloch) и математический логик Уолтер Питтс (Walter Pitts) путем изучения биологических нейронов предложили математику искусственных нейронных сетей, имитирующих механизм биологических нейронов.Это достижение получило дальнейшее развитие в Перцептроне. модель американского нейробиолога Фрэнка Розенблатта, которая также является краеугольным камнем современного глубокого обучения.
Мы начинаем со структуры нейрона, чтобы смоделировать процесс обработки сигнала этим нейроном.
Как показано на рисунке а ниже, входной вектор нейрона, после отображения функции:тогда получить y, где— собственный параметр функции f. Здесь мы рассматриваем упрощенный случай линейного преобразования:, поскольку и w, и x являются векторами, мы можем преобразовать его в скалярную форму следующим образом:
Логический процесс приведенного выше расчета можно визуально отобразить с помощью следующего рисунка б.
Вышеупомянутые нейроны содержат несколько входных данных. Чтобы облегчить понимание, мы можем пожелать еще больше упростить модель. В настоящее время n = 1, то есть мы предполагаем, что линейная модель:
вОн представляет собой наклон модели, а b представляет точку пересечения, или здесь мы говорим о смещении.
Мы знаем, что для прямой нам достаточно знать две точки и решить систему бинарных линейных уравнений, чтобы получить конкретное выражение прямой, то есть решитьзначение .
Это верно в идеальном состоянии, но реальность всегда жестока.Данные, которые мы получаем, могут иметь определенные ошибки.В настоящее время мы просто не можем построить такую идеальную прямую линию, чтобы соответствовать этим точкам данных. мы могли бы также использоватьпредставить ошибку наблюдения, предполагая, что ошибка удовлетворяет, то наша модель может быть преобразована в:
Хотя мы не можем идеально провести эти точки данных через прямую линию, наше текущее требование состоит в том, чтобы найти такую прямую, насколько это возможно, чтобы «расстояние» от всех точек данных до этой прямой было наименьшим, тогда полученное прямая наша более удовлетворительная модель.
Так как же измерить минимальное «расстояние» всех точек данных до этой линии? Как измерить «хорошее» и «плохое» этой модели? В это время нам нужно выявить нашу функцию потерь, Естественная идея состоит в том, чтобы найти среднее значение суммы квадратов разностей между прогнозируемым значением и истинным значением всех точек выборки текущей модели в качестве функции потерь эта модель, то есть среднеквадратическая ошибка, которую мы часто упоминаем, функция потерьВыражение выглядит следующим образом:
Когда значение, рассчитанное нашей функцией потерь, относительно велико, это означает, что эффект аппроксимации линии плохой.Когда значение, рассчитанное нашей функцией потерь, относительно мало, это означает, что эффект аппроксимации в это время достиг хорошего уровень Степень. Следовательно, мы могли бы также сделать так, чтобы значение функции потерь достигло минимума, параметры модели в это время равны, тогда:
Прочитав это, знают ли судьи, как написать следующее? Правильно, следующим шагом будет определение минимального значения функции потерь с помощью алгоритма градиентного спуска,
В связи с этим необходимо решить функцию потерь соответственно дляЧастная производная , процесс решения выглядит следующим образом:
который:
Получив частную производную, мы можем использовать старуюобновить получить новый, который представляет собой процесс итерации обновления. После обновления снова пересчитываем частную производную и обновляем параметры, и так далее и тому подобное, пока значение вычисляемой нами функции потерь не достигнет приемлемого диапазона, то есть наша цель не будет достигнута.
Ниже мы моделируем этот процесс с помощью кода.
- NumPy случайным образом генерирует набор данных и первоначально наблюдает за распределением данных через Matplotlib.
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 用于生成样本数据
Return:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
"""
def establish_data(data_number):
x_data = np.random.uniform(-10, 10, data_number)
eps = np.random.normal(0, 1, data_number)
y_data = x_data * 1.474 + 0.86 + eps
return x_data, y_data
if __name__ == "__main__":
x_data, y_data = establish_data(100)
from matplotlib import pyplot as plt
plt.scatter(x_data, y_data)
plt.show()
Текущие результаты следующие, можно видеть, что распределение данных можно приблизительно описать прямой линией:
- Рассчитать среднеквадратичную ошибку на основе данных и текущих значений w и b
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 计算均方误差
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
w_now: 当前的w参数
b_now: 当前的b参数
Return:
mse_value: 均方误差值
"""
def calc_mse(x_data, y_data, w_now, b_now):
x_data, y_data = np.mat(x_data), np.mat(y_data)
_, data_number = x_data.shape
return np.power(w_now * x_data + b_now - y_data, 2).sum() / float(data_number)
- Обновите параметры w и b за одну итерацию.
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 更新迭代一次w、b
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
w_now: 当前的w参数
b_now: 当前的b参数
learning_rate: 学习率
Return:
w_new: 更新迭代之后的w
b_new: 更新迭代之后的b
"""
def step_gradient(x_data, y_data, w_now, b_now, learning_rate):
x_data, y_data = np.mat(x_data), np.mat(y_data)
w = (w_now * x_data + b_now - y_data) * x_data.T * 2 / x_data.shape[1]
b = (w_now * x_data + b_now - y_data).sum() * 2 / x_data.shape[1]
return w_now - w * learning_rate, b_now - b * learning_rate
- Несколько итераций для обновления w, b (внешний цикл)
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 多次迭代更新w、b(外循环)
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
starting_w: 初始的w参数
starting_b: 初试的b参数
learning_rate: 学习率
max_iter:最大迭代次数
Return:
w:得到的最终w
b: 得到的最终b
loss_list: 每次迭代计算的损失值
"""
def gradient_descent(x_data, y_data, starting_b, starting_w, learning_rate, max_iter):
b, w = starting_b, starting_w
loss_list = list()
for step in range(max_iter):
w, b = step_gradient(x_data, y_data, w, b, learning_rate)
loss = calc_mse(x_data, y_data, w, b)
loss_list.append(loss)
return w, b, np.array(loss_list)
- Визуализация результатов подбора
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 拟合结果的可视化
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
w: 拟合得到的模型w参数
b: 拟合得到的模型b参数
loss_list: 每次更新迭代得到的损失函数的值
"""
def plot_result(x_data, y_data, w, b, loss_list):
from matplotlib import pyplot as plt
%matplotlib inline
plt.subplot(2, 1, 1)
plt.scatter(x_data, y_data)
x_line_data = np.linspace(-10, 10, 1000)
y_line_data = x_line_data * w + b
plt.plot(x_line_data, y_line_data, "--", color = "red")
plt.subplot(2, 1, 2)
plt.plot(np.arange(loss_list.shape[0]), loss_list)
plt.show()
Результат работы программы следующий:
Исходя из приведенных выше результатов, мы можем проанализировать, что эффект подгонки модели линейной регрессии неплох, и он может полностью отражать закон распределения данных. Кроме того, по диаграмме изменения функции убытков и конкретным значениям мы можем наблюдать, что изменение значения убытка на ранней стадии очень велико, а на более поздней стадии оно практически не изменяется. , это эффект метода градиентного спуска, то есть чем больше значение нашей функции потерь, тем более очевиден эффект оптимизации нашего метода градиентного спуска.
Полный код:
import numpy as np
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 用于生成样本数据
Return:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
"""
def establish_data(data_number):
x_data = np.random.uniform(-10, 10, data_number)
eps = np.random.normal(0, 1, data_number)
y_data = x_data * 1.474 + 0.86 + eps
return x_data, y_data
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 计算均方误差
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
w_now: 当前的w参数
b_now: 当前的b参数
Return:
mse_value: 均方误差值
"""
def calc_mse(x_data, y_data, w_now, b_now):
x_data, y_data = np.mat(x_data), np.mat(y_data)
_, data_number = x_data.shape
return np.power(w_now * x_data + b_now - y_data, 2).sum() / float(data_number)
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 更新迭代一次w、b
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
w_now: 当前的w参数
b_now: 当前的b参数
learning_rate: 学习率
Return:
w_new: 更新迭代之后的w
b_new: 更新迭代之后的b
"""
def step_gradient(x_data, y_data, w_now, b_now, learning_rate):
x_data, y_data = np.mat(x_data), np.mat(y_data)
w = (w_now * x_data + b_now - y_data) * x_data.T * 2 / x_data.shape[1]
b = (w_now * x_data + b_now - y_data).sum() * 2 / x_data.shape[1]
return w_now - w * learning_rate, b_now - b * learning_rate
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 多次迭代更新w、b(外循环)
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
starting_w: 初始的w参数
starting_b: 初试的b参数
learning_rate: 学习率
max_iter:最大迭代次数
Return:
w:得到的最终w
b: 得到的最终b
loss_list: 每次迭代计算的损失值
"""
def gradient_descent(x_data, y_data, starting_b, starting_w, learning_rate, max_iter):
b, w = starting_b, starting_w
loss_list = list()
for step in range(max_iter):
w, b = step_gradient(x_data, y_data, w, b, learning_rate)
loss = calc_mse(x_data, y_data, w, b)
loss_list.append(loss)
return w, b, np.array(loss_list)
"""
Author: Taoye
微信公众号: 玩世不恭的Coder
Explain: 拟合结果的可视化
Parameters:
x_data: 数据样本的一个属性
y_data: 数据样本的另一个属性
w: 拟合得到的模型w参数
b: 拟合得到的模型b参数
loss_list: 每次更新迭代得到的损失函数的值
"""
def plot_result(x_data, y_data, w, b, loss_list):
from matplotlib import pyplot as plt
%matplotlib inline
plt.subplot(2, 1, 1)
plt.scatter(x_data, y_data)
x_line_data = np.linspace(-10, 10, 1000)
y_line_data = x_line_data * w + b
plt.plot(x_line_data, y_line_data, "--", color = "red")
plt.subplot(2, 1, 2)
plt.plot(np.arange(loss_list.shape[0]), loss_list)
plt.show()
if __name__ == "__main__":
x_data, y_data = establish_data(100)
w, b, loss_list = gradient_descent(x_data, y_data, 0, 0, 0.01, 1000)
plot_result(x_data, y_data, w[0, 0], b, loss_list)
Вышеизложено все содержание линейной регрессии в этой статье.Вообще говоря, это довольно просто, и коэффициент сложности не так велик.Мы объясним больше о линейной регрессии позже.
Здесь мы делаем краткое изложение линейной регрессии:
Достоинства: Результаты легче понять, расчеты не сложные, не слишком много сложных формул и наворотов Недостатки: это не подходит для нелинейной подгонки данных, и все еще есть возможности для оптимизации временной сложности. Применимые типы данных: числовые и номинальные данные
Я Taoye, я люблю учиться, делиться и люблю различные технологии. В свободное время я люблю играть в шахматы, слушать музыку и говорить об анимации. Я надеюсь использовать это для записи моего собственного процесса роста и жизни. Я также надеюсь, что смогу завести больше друзей-единомышленников в кругу, и приглашаю посетить WeChat Princess для получения большего количества контента:Циничный кодер.
Увидимся в следующий раз, пока~~
Использованная литература:
[1] «Машинное обучение на практике»: издательство Питера Харрингтона «Народная почта и телекоммуникации».
[2] «Глубокое обучение TensorFlow»: Учитель Лонг Лонг
[3] Объяснение принципа алгоритма градиентного спуска: https://blog.csdn.net/qq_41800366/article/details/86583789
Рекомендуемое чтение
«Машинное обучение в действии» — байесовский диалект
«Машинное обучение в действии» — одноклассница спросила Таое, как следует играть KNN, чтобы пройти уровень.
«Машинное обучение в действии» — тот, кто понимает, понимает, а тот, кто не понимает, понимает. Нелинейные машины опорных векторов
«Машинное обучение в действии» — друзья, приходите и играйте, дерево решений
«Машинное обучение в действии» — Taoye расскажет, что за «призрак» представляет собой дерево решений
«Машинное обучение в действии» — анализ машин опорных векторов и оптимизация SMO
«Машинное обучение в действии» — анализ машин опорных векторов, разрыв линейного SVM одной рукой
print("Привет, NumPy!")
Что ты не можешь сделать, сначала поешь
Таойе проникла в штаб-квартиру черной платформы, и правда, стоящая за этим, была чрезвычайно ужасающей.
«База данных Dahua» — когда выполняется оператор SQL, какие небольшие действия выполняет нижний уровень?