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

用 keras 搭建出一个判断今天是周几的模型?

  •  
  •   zungmou · 2022-04-03 17:38:21 +08:00 · 3117 次点击
    这是一个创建于 956 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有没有前辈,能不能教下,如何用 keras 搭建一个模型,例如

    x=[[2022, 12, 31]] x.shape = (-1, 3) y=[[6]] y.shape = (-1, 1)

    x 对应日期,y 对应星期几,生成从 1000 年到 2021 年所有的日期对应的周几进行训练,这种模型要如何搭建?

    我用了 Dense(64, activation='relu', input_shape=(3,)) Dense(64, activation='relu') Dense(1) 模型训练,并不能得到一个很好的结果。 刚入门,希望有前辈能给一点提示。

    31 条回复    2022-04-05 00:46:48 +08:00
    idblife
        1
    idblife  
       2022-04-03 18:16:34 +08:00
    有时候挺服搞机器学习的
    搞了这算法那算法,一看效果还不如十几年前用 sql 写的数据分析。。。
    Licsber
        2
    Licsber  
       2022-04-03 18:27:21 +08:00
    推荐知乎镜像问题:如何用深度学习判断某数是否是 2 的倍数?
    这类问题对这种依靠“经验”的概率模型无解
    建议 OP 放弃尝试 转而去研究 cv
    jdhao
        3
    jdhao  
       2022-04-03 18:31:21 +08:00 via Android
    这个还需要模型吗,这都是固定算法可以算出来的
    omegatheta
        4
    omegatheta  
       2022-04-03 18:39:35 +08:00 via Android
    你把你的输入二进制化可能还好点
    Jooooooooo
        5
    Jooooooooo  
       2022-04-03 19:25:47 +08:00
    ?

    一个 O(1) 的公式咋还扯上机器学习了?

    这就好像你用机器学习学加法一样. 不如研究一下机器如何能"理解"加法的规则.
    GRUNK
        6
    GRUNK  
       2022-04-03 19:37:32 +08:00 via iPhone
    这个不是有公式可以直接算出来那一天是周几的吗
    youngce
        7
    youngce  
       2022-04-03 19:41:08 +08:00   ❤️ 1
    补充一点:在一些计算机程序中,按照简单的算法直接反推公元 1 年 1 月 1 日,是星期一。

    但是教皇格里戈八世在 1582 年 2 月 24 日颁布法令,永远抹去了 1582 年 10 月 5 日到 1582 年 10 月 14 日。历史上从来不曾有过这 10 天。1582 年 10 月 4 日是星期四,它的第二天是 1582 年 10 月 15 日星期五。

    因此考虑到这 10 天的影响再去推算,公元元年 1 月 1 日就是星期六了。

    这也是很多日历为什么显示公元元年 1 月 1 日是星期六
    zungmou
        8
    zungmou  
    OP
       2022-04-03 19:50:15 +08:00 via iPhone
    @jdhao 目的是尝试用神经网络
    zungmou
        9
    zungmou  
    OP
       2022-04-03 19:50:57 +08:00 via iPhone
    @omegatheta 能具体再说下吗?二进制化?
    zungmou
        10
    zungmou  
    OP
       2022-04-03 19:52:50 +08:00 via iPhone
    @GRUNK 嗯,重点不是算星期几的算法,是想搭建一套神经网络来试试看能不能做到计算。
    zungmou
        11
    zungmou  
    OP
       2022-04-03 19:54:28 +08:00 via iPhone
    @youngce 谢谢,我一会试试看 Python 内置的日历是否存在你说的这个问题。
    zungmou
        12
    zungmou  
    OP
       2022-04-03 19:56:00 +08:00 via iPhone
    @Licsber 没有搜索到类似问题,我的目的也是类似,能否给个链接?谢谢
    labulaka521
        13
    labulaka521  
       2022-04-03 20:53:10 +08:00
    我有个想法,用深度学习预测什么时候拉屎
    paopjian
        14
    paopjian  
       2022-04-03 20:56:44 +08:00
    机器学习不是用来解决精确数学的,是解决模糊数学的
    他们说的应该是这个问题吧 https://www.zhihu.com/question/51362842
    lizytalk
        15
    lizytalk  
       2022-04-03 23:41:51 +08:00 via iPhone   ❤️ 1
    @idblife 人家这明显就是用来练习的练习题呀,我们当时作业还做过让 lstm 学习整数加法呢……
    idblife
        16
    idblife  
       2022-04-03 23:50:05 +08:00 via iPhone
    @lizytalk
    知道 op 是为了联系,是想起我司 ai 部门有感而发
    ipwx
        17
    ipwx  
       2022-04-03 23:52:42 +08:00
    @lizytalk

    机器学习不是魔法,需要特征工程。

    但是题目中的问题一旦涉及到特征工程,就和朴素的算星期几没有多少差别了。
    ipwx
        18
    ipwx  
       2022-04-03 23:57:12 +08:00   ❤️ 2
    ps 补充“特征工程”这个论点。

    如何用神经网络学习奇偶判定?直接放进去一个数是不行的,因为机器学习模型在这个问题上,任何超出训练集范围的数都是“训练分布外的数据”,不能得到有意义的输出。

    正确的方法是比如,转换成二进制,拆成若干 0/1 串。。。。那恭喜你,正确答案就是看最低位的。这个机器学习能学到。但是已经转换成二进制了,那和直接写出奇偶判定的程序,也差别不大了。

    当然你也可以转换成四进制、八进制,十进制,六进制。这几个进制对于奇偶判定的问题都比较 easy 。若是转换为三进制、五进制,多看几位应当也能搞定。这就是机器学习和人做奇偶判定程序有区别的地方了,人的话必须先二进制,然后才能给答案,第一步特征工程必须非常精确。但是机器学习的话,稍微有点偏差,给个 X 进制,也能凑合着学出来。所以它比普通的程序算法要稍微“智能”那么一点。
    misdake
        19
    misdake  
       2022-04-04 00:20:31 +08:00
    神经网络很难做取模运算吧。可以试试输入二进制化后的一堆 0 和 1 ,输出改成分类而不是直接输出 1 个数字。
    daweii
        20
    daweii  
       2022-04-04 00:25:58 +08:00
    如果不怎么在乎实现难度的话可以考虑把年月日转换成 embedding 输入。
    mxT52CRuqR6o5
        21
    mxT52CRuqR6o5  
       2022-04-04 04:57:21 +08:00 via Android
    虽然在工业实践上不该这么做,但在学术上研究这些问题是有意义的
    ted2011
        22
    ted2011  
       2022-04-04 12:08:41 +08:00
    我记得 莫烦 有个类似的例子, 但一下找不到了, 你找找看
    ted2011
        23
    ted2011  
       2022-04-04 12:14:55 +08:00
    找到了, 莫烦的例子是

    # 中文的 "年-月-日" -> "day/month/year"
    "98-02-26" -> "26/Feb/1998"

    https://mofanpy.com/tutorials/machine-learning/nlp/seq2seq/

    当然, 你这个模型要比莫烦这个例子难不少, 有没有解都不好说.

    建议入门时选一些难度适宜的
    zungmou
        24
    zungmou  
    OP
       2022-04-04 15:47:26 +08:00
    @paopjian 谢谢
    zungmou
        25
    zungmou  
    OP
       2022-04-04 15:48:39 +08:00
    @ipwx 大佬,那换句话说,机器学习能够做到学会转换二级制吗?
    zungmou
        26
    zungmou  
    OP
       2022-04-04 15:49:56 +08:00
    @misdake 谢谢。
    zungmou
        27
    zungmou  
    OP
       2022-04-04 15:50:34 +08:00
    @ted2011 谢谢您
    RuiCBai
        28
    RuiCBai  
       2022-04-04 17:58:24 +08:00 via Android
    可以的!
    根据日期计算星期几是有公式的,叫蔡勒公式(但仅仅适用于 1582 年之后的日期)。
    你用神经网络判断周几,无非就是用神经网络拟合这个复杂的函数,根据通用近似定理,肯定是可以的。

    先可以根据这个公式生成大量样本,然后再训练。需要注意的是,不要使用 1582 年之前的日期,因为这样 样本可能不满足同分布 了,就会导致效果很差。
    ipwx
        29
    ipwx  
       2022-04-05 00:42:48 +08:00
    @zungmou 你得设置合适的目标函数。。。但反过来这可能又等价于你转换成二进制了。
    ipwx
        30
    ipwx  
       2022-04-05 00:44:48 +08:00
    @RuiCBai universal approximation theory 只说了,神经网络能表示任何一个可测集上的连续函数函数,但是不保证你的训练方法能恰好找到这个潜在的函数。大部分情况下训练样本外的数据,现在的神经网络并不保证能给出有意义的解。
    ipwx
        31
    ipwx  
       2022-04-05 00:46:48 +08:00
    @RuiCBai 训练样本分布外

    假设训练样本的分布是 p(x),那么现在的大部分训练出来的神经网络在 p(x) 定义域之外的分布上并不能给出有意义的解。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5979 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:31 · PVG 10:31 · LAX 18:31 · JFK 21:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.