Начало работы с машинным обучением за 10 строк кода

Python
Начало работы с машинным обучением за 10 строк кода

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

Ниже приводится краткое изложение моего обучения.

Начинать

Сяоцян пойдет в кино?

Рухуа, Сяоцянь, Сяомин и Сяоцян — хорошие друзья и часто вместе ходят в кино. Но Сяоцян не ходит туда каждый раз.Ситуация их первых четырех встреч в кино выглядит следующим образом: (1 означает ходить в кино, 0 означает не ходить в кино)

цветочный Сяоцянь Сяо Мин таракан
1 0 1 1
1 1 0 1
0 0 1 0
0 1 0 0

Если Сяоцянь и Сяомин собираются в пятый раз посмотреть фильм, если цветы не пойдут, пойдет ли Сяоцян?

цветочный Сяоцянь Сяо Мин таракан
1 0 1 1
1 1 0 1
0 0 1 0
0 1 0 0
0 1 1 ?

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

Как процесс мышления и анализа человеческого мозга может быть преобразован компьютером в мышление?

код выше

from numpy import array, exp, random, dot
X = array([[1,0,1],[1,1,0],[0,0,1],[0,1,0]])
y = array([[1,1,0,0]]).T
random.seed(1)
weights = 2 * random.random((3,1)) - 1
for _ in range(10000):
    output = 1/(1+exp(-dot(X, weights)))
    error = y - output
    delta = error * output * (1-output)
    weights += dot(X.T, delta)
    
p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0]
print("小强去不去:", "不去" if  p > 0.5 else "去")

Ровно 10 строк, не считая кода для печати. Если вы редко используете Python для научных вычислений, вы можете быть немного обмануты.Не волнуйтесь, ниже я объясню каждую строку кода.

импортировать библиотеку классов

from numpy import array, exp, random, dot

Можно сказать, что Numpy является краеугольным камнем научных вычислений в Python, и его очень удобно использовать. Для удобства математического расчета мы в основном импортируем array, exp, random, dot

  • массив: создать матрицу
  • exp: Экспоненциальная функция к основанию естественной константы e
  • random: генерировать случайные числа от 0 до 1
  • точка: умножение матриц

Генерация данных

X = array([
[1,0,1],[1,1,0],[0,0,1],[0,1,0]
])
y = array([[1,1,0,0]]).T

Сгенерируйте код для данных четырех человек, встречающихся для просмотра фильма в таблице выше, обратите внимание, что есть.TЭто означает транспонирование, которое преобразует вектор-строку в вектор-столбец следующим образом:

[           [
  [1,0,1],    [1],
  [1,1,0],    [1],
  [0,0,1],    [0],
  [0,1,0],    [0],    
]           ]

Генерация случайных весов

# 设置随机因子,让每次生成的随机数都一样,方便代码调试。
random.seed(1)
# 生成一个范围为 -1 ~ 1,3列的行向量。
weights = 2 * random.random((3,1))-1

Зачем устанавливать вес?

В качестве примера возьмем просмотр фильма в первый раз, [1,0,1] соответствует [1], и между ними существует определенная связь, а именно:

1*w1 + 0*w2 + 1*w3 = 1

w1,w2,w3, который представляет вес.

если мы сможем найтиw1,w2,w3, можно ли подставить в пятый раз ([0,1,1]), чтобы узнать, ходит ли Сяоцян в кино.

0*w1 + 1*w2 + 1*w3 = 小强去吗?

Как набрать вес?

Трудно заменить вес первой части данных на следующие три части данных.

Таким образом, мы случайным образом задаем набор весов, подставляем каждый набор данных, получаем ошибку, а затем изменяем вес, чтобы получить новую ошибку, и так далее, пока ошибка не будет минимизирована.Мы называем этот процесс машинным обучением

Веса оптимизации

for _ in range(10000):
    # 用 sigmoid函数将计算结果进行转换
    output = 1/(1+exp(-dot(X, weights)))
    # 用真实值减去计算结果求出误差
    error = y - output
    # 计算增量
    delta = error * output*(1-output)
    # 得到新的权重
    weights += dot(X.T, delta)

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

Зачем использовать сигмовидную функцию?

Поскольку диапазон результата расчета находится в диапазоне от положительной бесконечности до отрицательной бесконечности, для преобразования его в 0~1 используется сигмоидальная функция, что удобно для классификации.

Как рассчитать прибавку?

delta = error * output*(1-output)

Разделите приведенное выше предложение на две строки кода для лучшего понимания:

# 计算斜率,也就是对计算结果进行求导
slope = output*(1-output)

# 基于 error 计算出 delta,用于更新权重
delta = error * slope

Что такое наклон?

Так как результат расчета преобразуется в гладкую кривую от 0 до 1 по сигмовидной функции. Если ошибка меньше, результат расчета должен приближаться к 0 или 1 без проводов, и чем ближе он к 0 или 1, тем меньше наклон

Зачем умножать ошибку на наклон?

В градиентном спуске чем ближе к оптимальной точке, тем меньше наклон, поэтому там, где наклон наименьший, мы хотим уменьшить изменение дельты, чтобы не пропустить оптимальную точку.

результат прогноза

p = 1/(1+exp(-dot([[1,0,0]], weights)))[0][0]
print("小强去不去:", "不去" if  p > 0.5 else "去")
// => 不去

Подставьте веса после 10 000 оптимизаций в [1, 0, 0] для вычисленияpза0.9999253713868242, больше 0,5 и бесконечно близко к 1, поэтому Сяо Мин пойдет в кино.

Суммировать

Выше приведена интерпретация всех 10 строк кода.

Чтобы свести к минимуму требуемую экспертизу, эти 10 строк кода не учитывают локальные оптимумы и не учитывают сходимость результатов вычислений, поэтому код недостаточно строгий, но его достаточно, чтобы отразить весь механизм работы машинного обучения. .

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

Наконец, большое спасибо автору видео, видео действительно хорошо сделано, что делает малоизвестный контент таким простым для понимания. Настоятельно рекомендую посмотреть.Говоря о нейросети, 10 строк кода не настраивают пакет, я не понимаю, вы меня ударили!