V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daijinming
V2EX  ›  程序员

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

  •  
  •   daijinming · 2020-10-16 16:29:37 +08:00 · 3831 次点击
    这是一个创建于 1259 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    39 条回复    2020-10-17 16:21:03 +08:00
    nznd
        1
    nznd  
       2020-10-16 16:36:49 +08:00
    一时间不知道从哪里吐槽 虽然但是 深度学习确实可以做这个模型 有必要用机器学习吗?
    iblislsy
        2
    iblislsy  
       2020-10-16 16:39:06 +08:00
    这波啊,这波叫肉蛋充饥
    superrichman
        3
    superrichman  
       2020-10-16 16:44:11 +08:00 via iPhone
    ???我有很多问号
    你是想找线性回归吗?
    raymanr
        4
    raymanr  
       2020-10-16 16:48:16 +08:00   ❤️ 6
    就是一般的线性回归就可以了

    from sklearn.linear import LinearRegression

    m = LinearRegression()
    m.fit([[2015],[2016],[2017],[2018]],[4,5,6,7])
    m.predict([[2020]])
    Biggoldfish
        5
    Biggoldfish  
       2020-10-16 16:49:38 +08:00   ❤️ 1
    这个问题让我想起了这个图
    https://twitter.com/jebbery/status/995491957559439360
    jdhao
        6
    jdhao  
       2020-10-16 16:50:38 +08:00 via Android
    😂这尼玛需要机器学习?你是来钓鱼的?
    raymanr
        7
    raymanr  
       2020-10-16 16:54:11 +08:00   ❤️ 1
    @raymanr 我打错了,是 sklearn.linear_model, 也不要冷嘲热讽了, 就当楼主是真的在求问吧, 谁不是一步步走过来的呢?
    daijinming
        8
    daijinming  
    OP
       2020-10-16 17:01:45 +08:00
    @raymanr 真的是在求问
    capallen
        9
    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
        10
    dcalsky  
       2020-10-16 17:07:16 +08:00 via Android
    一层 dense 即可
    Raven316
        11
    Raven316  
       2020-10-16 17:11:20 +08:00
    x-2011?
    user8341
        12
    user8341  
       2020-10-16 17:11:42 +08:00
    什么叫预测啊,起码要有点随机性吧?你这个明明是一个确定性的线性函数,哪里有丝毫随机性?
    raycool
        13
    raycool  
       2020-10-16 17:14:28 +08:00   ❤️ 1
    这个不就是 y = x - 2011
    直接就完美拟合了。
    daijinming
        14
    daijinming  
    OP
       2020-10-16 17:19:50 +08:00
    @raycool 一般人都能推导出这个公式,我想咨询下大家,如何让机器也能推导出来,
    winstars
        15
    winstars  
       2020-10-16 17:20:05 +08:00
    @raycool #13 这已经不是拟合了吧
    jmc891205
        16
    jmc891205  
       2020-10-16 17:22:44 +08:00
    对楼主这个例子,可以使用 scipy 的 leastsq(),用最小二乘法来拟合一个线型函数
    daijinming
        17
    daijinming  
    OP
       2020-10-16 17:25:46 +08:00
    @jmc891205 能不能给新手指教下,听着好像有道理,但是基本听不懂
    raymanr
        18
    raymanr  
       2020-10-16 17:27:30 +08:00   ❤️ 1
    @daijinming 把年份视作系数矩阵, 年龄视作结果向量
    year*x1+x2=age, 得到线性方程组
    2015*x1+x2=4
    2016*x1+x2=5
    2017*x1+x2=6
    2018*x1+x2=7,
    然后解这个方程组得到 x1 和 x2 的值, 并用于预测

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

    更深入的部分我能力有限,给不了建议
    jmc891205
        19
    jmc891205  
       2020-10-16 17:36:25 +08:00
    @daijinming 你随便 Google 搜一下"最小二乘法 leastsq",很多人写过这东西了。
    Escapist367
        20
    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()))
    TimePPT
        21
    TimePPT  
       2020-10-16 19:00:16 +08:00 via Android
    假如 小明 2015 年 4 岁,2016 年 5 岁,2017 年 6 岁,那 2020 年小明几岁?
    TimePPT
        22
    TimePPT  
       2020-10-16 19:00:35 +08:00 via Android
    @TimePPT 如果输入是这段文本,题的难度就大了
    askfermi
        23
    askfermi  
       2020-10-16 19:18:23 +08:00
    NLP 来了。

    ![Snipaste_2020-10-16_13-17-22.png]( https://i.loli.net/2020/10/16/hQjPD1g3ZOkxdon.png)
    glorifiedatom
        24
    glorifiedatom  
       2020-10-16 20:41:39 +08:00 via iPhone
    @nznd
    @superrichman
    @jdhao
    冷嘲热讽,阴阳怪气,谁不是从小白走过来的呢?
    jdhao
        25
    jdhao  
       2020-10-16 21:01:39 +08:00 via Android
    @glorifiedatom 2015 年四岁,2020 年岁数计算需要用机器学习?
    Sunben
        26
    Sunben  
       2020-10-16 21:06:22 +08:00
    这还用机器?用人脑都能算出来,你看看你码代码和我算的哪个快点
    vansl
        27
    vansl  
       2020-10-16 21:08:10 +08:00
    楼主只是举了不恰当的例子,确实没必要冷嘲热讽,知道需要表达线性回归的意思就可以了
    恰当的例子是房价预测,60 平方 100 万,90 平方 140 万,120 平方 160 万,预测 150 方的价格
    glorifiedatom
        28
    glorifiedatom  
       2020-10-16 21:12:57 +08:00 via iPhone
    @jdhao 前言不搭后语的。我说的根本不是这个问题。
    glorifiedatom
        29
    glorifiedatom  
       2020-10-16 21:15:18 +08:00 via iPhone
    人家好好问问题的,你好好说就行了,没必要看不起人家,开口就“来钓鱼的”。不惮用最坏的恶意揣测别人?
    jdhao
        30
    jdhao  
       2020-10-16 21:31:16 +08:00 via Android
    @glorifiedatom 问问题不说清楚,还怪别人,巨婴性格?
    jdhao
        31
    jdhao  
       2020-10-16 21:34:04 +08:00 via Android   ❤️ 4
    @glorifiedatom 这种问题如果在 stackoverflow,活不过一天,提问也不是不用任何努力的,问题都不说明,让别人回答啥?提问的智慧,值得每个人读一读。https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
    nznd
        32
    nznd  
       2020-10-17 00:41:27 +08:00
    @glorifiedatom #24 我是在避免 XY problem 反问了是否需要机器学习 请问有问题吗?
    littlewing
        33
    littlewing  
       2020-10-17 00:45:50 +08:00
    楼主只是举个例子而已吧,只是例子举得不好
    superrichman
        34
    superrichman  
       2020-10-17 02:42:34 +08:00 via iPhone
    @glorifiedatom #24 对方问了一个奇怪的问题,我表示很疑惑,有什么问题吗?我敢肯定要是你拿这个问题到大街上去问,别人也会一脸迷茫。

    我觉得他不确定自己需要什么,所以试探性给他一个关键词线性回归,根据他自己说的 python 模型 再加上线性回归,这三个关键词我觉得能搜出有用的信息的。
    user8341
        35
    user8341  
       2020-10-17 02:47:29 +08:00
    @littlewing 举这个例子说明他基本概念都不懂。我也举个例子:

    知乎有这么一个问题:1,2,4,8,16……数列的下一项是什么?

    答案不是 32
    glorifiedatom
        36
    glorifiedatom  
       2020-10-17 10:08:22 +08:00 via iPhone
    @jdhao
    首先,开口就来钓鱼的。我只想说这反映了你的素质。
    其次,这里不是 StackOverflow,V2 不是纯技术社区,程序员板块也不是纯技术板块,更何况不是每一个程序员都有机器学习 /统计背景。你用其他社区的标准要求别人无异于指鹿为马,居心叵测。

    再次,你所谓的提问的智慧不是你攻击提问者的理由。如果你认为他这个问题问得不好,就提出建设性意见,而不是无端的嘲讽和攻击(“尼玛”,“钓鱼”)。你的行为不仅体现你个人的情商素质,还会打击提问者的信心,长期以往还会影响社区的氛围。

    最后,我用十分钟打这些字,不求你能有所收获,毕竟三观不是我的几十个字就能改变的。但是鉴于你我三观不合,我选择 Block 你。只希望这段话能给以后看到的 V 友们一些帮助。欢迎友善的讨论。
    alixali
        37
    alixali  
       2020-10-17 12:50:12 +08:00 via iPad
    你这只是想得到一个公式,,为什么不百度一下呢?
    yanqiyu
        38
    yanqiyu  
       2020-10-17 15:07:38 +08:00 via Android
    这问题很复杂,我需要小明的健康状况以及健康状况-三年死亡率的大数据,计算小明在 2017~2020 年之间会不会暴毙
    winglight2016
        39
    winglight2016  
       2020-10-17 16:21:03 +08:00
    哈哈,lz 在程序员论坛问这个问题,得到了无情嘲弄,虽然值得同情,不过,如果问题质量也可以打分的话,10 分满分,我给你 1 分,奖励你的勇气。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   952 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:28 · PVG 05:28 · LAX 14:28 · JFK 17:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.