如何使用 Python 或 matlab 实现一个简单根据年份预测年龄的模型

2020-10-16 16:29:37 +08:00
 daijinming

假如 小明 2015 年 4 岁,2016 年 5 岁,2017 年 6 岁,那 2020 年小明几岁? 哪位高手能否指教下,如果使用 python 或 matlab 采用机器学习的方法推导出模型?

3860 次点击
所在节点    程序员
39 条回复
nznd
2020-10-16 16:36:49 +08:00
一时间不知道从哪里吐槽 虽然但是 深度学习确实可以做这个模型 有必要用机器学习吗?
iblislsy
2020-10-16 16:39:06 +08:00
这波啊,这波叫肉蛋充饥
superrichman
2020-10-16 16:44:11 +08:00
???我有很多问号
你是想找线性回归吗?
raymanr
2020-10-16 16:48:16 +08:00
就是一般的线性回归就可以了

from sklearn.linear import LinearRegression

m = LinearRegression()
m.fit([[2015],[2016],[2017],[2018]],[4,5,6,7])
m.predict([[2020]])
Biggoldfish
2020-10-16 16:49:38 +08:00
这个问题让我想起了这个图
https://twitter.com/jebbery/status/995491957559439360
jdhao
2020-10-16 16:50:38 +08:00
😂这尼玛需要机器学习?你是来钓鱼的?
raymanr
2020-10-16 16:54:11 +08:00
@raymanr 我打错了,是 sklearn.linear_model, 也不要冷嘲热讽了, 就当楼主是真的在求问吧, 谁不是一步步走过来的呢?
daijinming
2020-10-16 17:01:45 +08:00
@raymanr 真的是在求问
capallen
2020-10-16 17:05:36 +08:00
import time,random

class AgeModel():
def fit(self,year_lst,age_lst):
self.birth_year = sorted(year_lst)[0] - sorted(age_lst)[0]
print("Training...")
time.sleep(random.randint(5,10))
print("Model is ready.")

def predict(self,pred_year):
print("Predicting...")
time.sleep(random.randint(1,4))
return (pred_year - self.birth_year)

age_model = AgeModel()
age_model.fit([2015,2016,2017,2018],[4,5,6,7])
age_model.predict(2020)

(用这个模型,可以浪费你生命中的 6-14 秒)
dcalsky
2020-10-16 17:07:16 +08:00
一层 dense 即可
Raven316
2020-10-16 17:11:20 +08:00
x-2011?
user8341
2020-10-16 17:11:42 +08:00
什么叫预测啊,起码要有点随机性吧?你这个明明是一个确定性的线性函数,哪里有丝毫随机性?
raycool
2020-10-16 17:14:28 +08:00
这个不就是 y = x - 2011
直接就完美拟合了。
daijinming
2020-10-16 17:19:50 +08:00
@raycool 一般人都能推导出这个公式,我想咨询下大家,如何让机器也能推导出来,
winstars
2020-10-16 17:20:05 +08:00
@raycool #13 这已经不是拟合了吧
jmc891205
2020-10-16 17:22:44 +08:00
对楼主这个例子,可以使用 scipy 的 leastsq(),用最小二乘法来拟合一个线型函数
daijinming
2020-10-16 17:25:46 +08:00
@jmc891205 能不能给新手指教下,听着好像有道理,但是基本听不懂
raymanr
2020-10-16 17:27:30 +08:00
@daijinming 把年份视作系数矩阵, 年龄视作结果向量
year*x1+x2=age, 得到线性方程组
2015*x1+x2=4
2016*x1+x2=5
2017*x1+x2=6
2018*x1+x2=7,
然后解这个方程组得到 x1 和 x2 的值, 并用于预测

推荐可以买一些机器学习的书尝试一下手写一些常见算法就明白了一些回归和分类以及聚类的常见套路了

更深入的部分我能力有限,给不了建议
jmc891205
2020-10-16 17:36:25 +08:00
@daijinming 你随便 Google 搜一下"最小二乘法 leastsq",很多人写过这东西了。
Escapist367
2020-10-16 18:16:21 +08:00
import torch

inputs=[]
outputs=[]
for year1 in range(1900,2020):
for year2 in range(1900,2020):
for age1 in range(0,120):
inputs.append([year1,year2,age1])
outputs.append([year2-year1+age1])

class LinearModel(torch.nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = torch.nn.Linear(3, 1)

def forward(self, inputs):
outputs = self.linear(inputs)
return outputs

model = LinearModel().cuda()
criterion = torch.nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

for epoch in range(100):
Loss=0
for i in range(len(inputs)//1000):
x=torch.tensor(inputs[i*1000:i*1000+1000]).cuda().float()
y=torch.tensor(outputs[i*1000:i*1000+1000]).cuda().float()
y_pred = model(x)
loss = criterion(y, y_pred)
optimizer.zero_grad()
loss.backward()
optimizer.step()
Loss+=loss.item()
print("Loss:%.2f"%Loss)


print("1999 年 45 岁的人在 2020 年为%.0f 岁"%model(torch.tensor([1999,2020,45]).cuda().float()))
print("1927 年 15 岁的人在 2020 年为%.0f 岁"%model(torch.tensor([1927,2020,15]).cuda().float()))
print("1979 年 77 岁的人在 2020 年为%.0f 岁"%model(torch.tensor([1979,2020,77]).cuda().float()))

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/715692

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX