社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

10行代码入门机器学习

缪宇 • 5 年前 • 371 次点击  
阅读 9

10行代码入门机器学习

最近在哔哩哔哩刷到一位up主,仅用了10行代码就实现了机器学习,真让我叹为观止。看视频戳这里

以下是我的学习总结。

开始

小强会去看电影吗?

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

如花 小倩 小明 小强
1 0 1 1
1 1 0 1
0 0 1 0
0 1 0 0

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

如花 小倩 小明 小强
1 0 1 1
1 1 0 1
0 0 1 0
0 1 0 0
0 1 1

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

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

上代码

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/Django开发社区
本文地址:http://www.python88.com/topic/63048
 
371 次点击