#python #neural-network
#python #нейронная сеть
Вопрос:
Я новичок в машинном обучении, и я пытался написать и алогритим, чтобы предсказать возраст человека в зависимости от его веса и роста
Вот мои данные:
import numpy as np
import matplotlib.pyplot as plt
# weight,height,age
data=[[50,160,15],
[45,156,13],
[55,162,17],
[56,163,18],
[58,163.4,20],
[12,85,2],
[14.2,95,3],
[15.4,100,4],
[32,138.4,10],
[25.8,128.3,8]]
# missing age data
mys=[22.4,121.1]
взятие случайных величин весов
w1=np.random.rand()
w2=np.random.rand()
b=np.random.rand()
для визуализации данных
for i in range(len(data)):
point=data[i]
plt.xlabel('weight')
plt.ylabel('length')
plt.scatter(point[0],point[1],c='red')
plt.scatter(mys[0],mys[1],marker='x',color='black',s=80)
вот моя нейронная сеть
alpha=0.00001
for i in range(500):
ri=np.random.randint(len(data))
point=data[ri]
pred=(point[0]*w1) (point[1]*w2) b
target=point[2]
cost=(pred-target)**2
dcost_pred=2*(pred-target)
dpred_w1=point[1]
dpred_w2=point[0]
dpred_db=1
dcost_w1=dcost_pred*dpred_w1
dcost_w2=dcost_pred*dpred_w2
dcost_b=dcost_pred*dpred_db
w1=(w1-alpha*dcost_w1)
w2=w2-alpha*dcost_w2
b=b-alpha*dcost_b
print(cost)
к сожалению, моя стоимость продолжает расти, у меня также есть два вопроса
1-Когда я должен использовать сигмоид?
2-Как выбрать правильную альфу?
ps: я ожидаю вывода 7 (возраст отсутствующих данных)
Комментарии:
1. сигмоид не является выбором активации для регрессии. Кроме того, alpha — это гиперпараметр, что означает, что вы должны настраивать его вручную. вы можете рассмотреть возможность увеличения его логарифмически.
2. Ваш код кажется правильным. Я бы посоветовал вам написать его, используя класс и методы для ясности. Кроме того, используйте numpy в процессе. передача пакетов в сети. Это будет работать быстрее.
3. @ragnar я все больше запутываюсь, потому что все кажется хорошим
4. я попытался использовать альфа-значение в качестве случайного числа, но это также не сработало
5. начните альфа с более высокого значения, скажем, альфа = 1, затем сделайте его 0,1. Позже уменьшите моду на 1e-2, 1e-3, 1e-4 и так далее.
Ответ №1:
Вопрос, который вы задали, состоит из трех частей.
1-я часть (что не так с кодом) Ответ: В этом нет ничего плохого. Просто правильный lr и инициализация
2-я часть (где использовать сигмоид). Ответ: нигде в регрессии.
3-я часть (правильная альфа): Ответ: начните с 1. запустите модель и наблюдайте за потерей. Сделайте alpha = 1e-1 и так далее. Во всем процессе наблюдаются потери. Какая бы альфа-версия ни давала небольшие потери, выберите это.
Код для 1-й части: (Выполните следующие действия)
b=np.zeros((1,))
alpha=1e-5
Да, именно так 🙂 Вы можете сохранить список потерь для каждой потери эпохи. Я сохранил это для вашего кода и получил следующий график. (Обратите внимание, что я использовал только 50 эпох. вы можете сохранить более высокие значения)
Полный код
import numpy as np
import matplotlib.pyplot as plt
# weight,height,age
data=[[50,160,15],
[45,156,13],
[55,162,17],
[56,163,18],
[58,163.4,20],
[12,85,2],
[14.2,95,3],
[15.4,100,4],
[32,138.4,10],
[25.8,128.3,8]]
# missing age data
mys=[22.4,121.1]
w1=np.random.rand()
w2=np.random.rand()
b=0
alpha=0.00001
loss = []
for i in range(50):
ri=np.random.randint(len(data))
point=data[ri]
pred=(point[0]*w1) (point[1]*w2) b
target=point[2]
cost=(pred-target)**2
dcost_pred=2*(pred-target)
dpred_w1=point[1]
dpred_w2=point[0]
dpred_db=1
dcost_w1=dcost_pred*dpred_w1
dcost_w2=dcost_pred*dpred_w2
dcost_b=dcost_pred*dpred_db
w1=(w1-alpha*dcost_w1)
w2=w2-alpha*dcost_w2
b=b-alpha*dcost_b
loss.append(cost)
plt.plot(loss)
Комментарии:
1. Надеюсь, это ответит на все ваши вопросы. Если это помогло вам, пожалуйста, проголосуйте, а также примите этот ответ 🙂
2. почему я должен создавать (b) массив?
3. также я попробовал внесенные вами изменения, но это также не сработало
4. Если вы не хотите этого делать, сделайте это b = 0.
5. Я изменил ответ. Пожалуйста, проверьте
Ответ №2:
В линейной регрессии нет необходимости в сигмоиде, поскольку нам нужны абсолютные значения, а не вероятности.
Для линейной регрессии лучше использовать нормальное уравнение, для этого вы можете обратиться к моему репозиторию github https://github.com/tunesh/Linear-Regression/blob/master/linear_regression.py
Комментарии:
1. у вас есть какие-либо идеи, почему стоимость увеличивается?
2. вы обновляете веса для каждого экземпляра (для каждой точки данных) ….. сделайте это для пакета данных.
3. можете ли вы объяснить больше?
4. @TuneshVerma я не согласен со вторым пунктом. Согласно теореме об универсальном приближении, они могут изучать любую функцию.
5. @Ragnar, это было то, о чем я думал, спасибо за разъяснение