最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 10行代码入门机器学习

    正文概述    2020-02-22   257

    10行代码入门机器学习

    开始

    小强会去看电影吗?

    如花,小倩,小明和小强,他们是好基友,经常相约去看电影。但小强不是每次都去,以下是他们前四次相约去看电影的情况:(1 表示去看电影,0 表示没去看电影)

    如花小倩小明小强
    1011110100100100

    假如第五次相约看电影,如花不去,小倩和小明要去,那么小强会去吗?

    如花小倩小明小强
    1011110100100100011

    我们人脑对以上数据进行分析,很容易看出,小强对如花有意思,如花去,小强就去,如花不去,小强就不去,所以得出结论,小强不去

    人脑思考分析的过程,怎么转换成让计算机思考呢?

    上代码

    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

    • array: 创建矩阵
    • exp:以自然常数e为底的指数函数
    • random: 生产0~1的随机数
    • dot: 矩阵相乘

    生成数据

    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

    w1w2w3,表示的就是权重。

    如果我们能求出w1w2w3,是不是就可以把第五次([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)

    循环往复 10000 次,让误差不断变小,最终得到最优的权重,将权重代入第五次的数据就可以推算出小强去不去看电影了。

    为什么要用 sigmoid 函数?

    由于计算结果的范围是正无穷到负无穷,用 sigmoid 函数转换成 0~1,方便进行分类,比如大于0.5 去看电影,小于0.5 不去看电影。

    怎么计算增量?

    delta = error * output*(1-output)

    将上面这句分拆成两句代码好理解一些:

    # 计算斜率,也就是对计算结果进行求导
    slope = output*(1-output)
    # 基于 error 计算出 delta,用于更新权重delta = error * slope

    斜率是什么?

    由于计算结果被 sigmoid 函数转换后为0~1的平滑曲线。 要想 error 越小,计算结果就要无线趋近于0或1,越趋近于0或者1斜率越小

    为什么要用让 error 乘以斜率?

    在梯度下降法中,越靠近最优点,斜率越小,所以在斜率最小的地方,我们要减小 delta 的变化,以免错过最优点。

    预测结果

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

    将经过10000次优化后的权重代入[1,0,0],计算出 p0.9999253713868242,大于 0.5 且无限接近于1,所以小明会去看电影。

    总结

    以上是这10行代码全部解读。

    这10行代码为了最小化所需专业知识,没有考虑局部最优,没有考虑计算结果收敛等问题,所以代码不够严谨,但足够体现机器学习的整个运行机制。

    通过这10行代码,可以体会到机器是如何模拟人类学习的——即通过不断试错,不断改正,最终得到正解。

    最后非常感谢视频作者,视频做的真好,让晦涩的内容变得如此通俗易懂。强烈推荐各位看一看。大话神经网络,10行代码不调包,听不懂你打我!


        更多python相关文章,请关注Python自学网。

    起源地下载网 » 10行代码入门机器学习

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元