10行代码实现机器学习的案例分析

发布时间:2020-06-24 09:48:57 作者:清晨
来源:亿速云 阅读:216

不懂10行代码实现机器学习的案例分析?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。

开始

小强会去看电影吗?

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

如花小倩小明小强
1011
1101
0010
0100

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

如花小倩小明小强
1011
1101
0010
0100
011

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

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

上代码

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

生成数据

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行代码实现机器学习的案例分析内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!

推荐阅读:
  1. 机器学习 - 回归分析
  2. accesslog分析案例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python 机器学习

上一篇:C程序总是从main函数开始执行吗

下一篇:zabbix 掌上运维

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》