update
many chore
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# 机器学习(AI)快速入门(quick start)
|
||||
|
||||
本章内容需要你掌握一定的 python 基础知识。
|
||||
::: warning 😇 本章内容需要你掌握一定的 python 基础知识。
|
||||
|
||||
如果你想要快速了解机器学习,并且动手尝试去实践他,你可以先阅览本部分内容。
|
||||
|
||||
@@ -11,8 +11,9 @@
|
||||
当然我需要承认一点,为了让大家都可以看懂,我做了很多抽象,具有了很多例子,某些内容不太准确,这是必然的,最为准确的往往是课本上精确到少一个字都不行的概念,这是难以理解的。
|
||||
|
||||
本篇内容只适合新手理解使用,所以不免会损失一些精度。
|
||||
:::
|
||||
|
||||
# 什么是机器学习
|
||||
## 什么是机器学习
|
||||
|
||||
这个概念其实不需要那么多杂七杂八的概念去解释。
|
||||
|
||||
@@ -22,17 +23,17 @@
|
||||
|
||||
然后你给了他更多信息,比如说国家给出了某些条例,他分析这个条例一出,房价就会降低,他给你了个新的数据。
|
||||
|
||||
因此我们得出一个结论:机器学习 = 泛型算法。
|
||||
因此我们得出一个结论:机器学习 = 泛型算法。
|
||||
|
||||
甚至深度学习,也只是机器学习的一部分,不过使用了更多技巧和方法,增大了计算能力罢了。
|
||||
|
||||

|
||||
|
||||
# 两种机器学习算法
|
||||
## 两种机器学习算法
|
||||
|
||||
你可以把机器学习算法分为两大类:监督式学习(supervised Learning)和非监督式学习(unsupervised Learning)。要区分两者很简单,但也非常重要。
|
||||
|
||||
## 监督式学习
|
||||
### 监督式学习
|
||||
|
||||
你是卖方的,你公司很大,因此你雇了一批新员工来帮忙。
|
||||
|
||||
@@ -50,7 +51,7 @@
|
||||
|
||||
这就是监督学习,你有一个参照物可以帮你决策。
|
||||
|
||||
## 无监督学习
|
||||
### 无监督学习
|
||||
|
||||
没有答案怎么办?
|
||||
|
||||
@@ -78,29 +79,27 @@
|
||||
|
||||
但是「机器在少量样本数据的基础上找出一个公式来解决特定的问题」不是个好名字。所以最后我们用「机器学习」取而代之。而深度学习,则是机器在数据的基础上通过很深的网络(很多的公式)找一个及解决方案来解决问题。
|
||||
|
||||
# 看看 Code
|
||||
## 看看 Code
|
||||
|
||||
如果你完全不懂机器学习知识,你可能会用一堆 if else 条件判断语句来判断比如说房价
|
||||
|
||||
```python
|
||||
def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
price = 0 # In my area, the average house costs $200 per sqft
|
||||
price_per_sqft = 200
|
||||
if neighborhood == "hipsterton":
|
||||
price = 0 # In my area, the average house costs $200 per sqft
|
||||
price_per_sqft = 200 i f neighborhood == "hipsterton":
|
||||
# but some areas cost a bit more
|
||||
price_per_sqft = 400
|
||||
elif neighborhood == "skid row":
|
||||
price_per_sqft = 400 elif neighborhood == "skid row":
|
||||
# and some areas cost less
|
||||
price_per_sqft = 100 # start with a base price estimate based on how big the place is
|
||||
price = price_per_sqft * sqft # now adjust our estimate based on the number of bedrooms
|
||||
if num_of_bedrooms == 0:
|
||||
# Studio apartments are cheap
|
||||
price = price - 20000
|
||||
else:
|
||||
price_per_sqft = 100 # start with a base price estimate based on how big the place is
|
||||
price = price_per_sqft * sqft # now adjust our estimate based on the number of bedrooms
|
||||
if num_of_bedrooms == 0:
|
||||
# Studio apartments are cheap
|
||||
price = price — 20000
|
||||
else:
|
||||
# places with more bedrooms are usually
|
||||
# more valuable
|
||||
price = price + (num_of_bedrooms * 1000)
|
||||
return price
|
||||
price = price + (num_of_bedrooms * 1000)
|
||||
return price
|
||||
```
|
||||
|
||||
假如你像这样瞎忙几个小时,最后也许会得到一些像模像样的东西。但是永远感觉差点东西。
|
||||
@@ -119,7 +118,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
|
||||
如果你可以找到这么一个公式:
|
||||
|
||||
Y(房价)=W(参数)*X1(卧室数量)+W*X2(面积)+W*X3(地段)
|
||||
Y(房价)=W(参数) \* X1(卧室数量) + W \*X2(面积) + W \* X3(地段)
|
||||
|
||||
你是不是会舒服很多,可以把他想象成,你要做菜,然后那些参数就是佐料的配比
|
||||
|
||||
@@ -151,7 +150,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
|
||||
第三步:
|
||||
|
||||
通过尝试所有可能的权重值组合,不断重复第二步。哪一个权重组合的代价最接近于 0,你就使用哪个。当你找到了合适的权重值,你就解决了问题!
|
||||
通过尝试所有可能的权重值组合,不断重复第二步。哪一个权重组合的代价最接近于 0,你就使用哪个。当你找到了合适的权重值,你就解决了问题!
|
||||
|
||||
兴奋的时刻到了!
|
||||
|
||||
@@ -176,7 +175,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
|
||||

|
||||
|
||||
<em>θ 表示当前的权重值。 J(θ) 表示「当前权重的代价」。</em>
|
||||
<em>θ 表示当前的权重值。J(θ) 表示「当前权重的代价」。</em>
|
||||
|
||||
这个等式表示,在当前权重值下,我们估价程序的偏离程度。
|
||||
|
||||
@@ -210,7 +209,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
|
||||
换言之,尽管基本概念非常简单,要通过机器学习得到有用的结果还是需要一些技巧和经验的。但是,这是每个开发者都能学会的技巧。
|
||||
|
||||
# 更为智能的预测
|
||||
## 更为智能的预测
|
||||
|
||||
我们通过上一次的函数假设已经得到了一些值。
|
||||
|
||||
@@ -229,7 +228,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
|
||||
<em>箭头头表示了函数中的权重。</em>
|
||||
|
||||
然而,这个算法仅仅能用于处理一些简单的问题,就是那些输入和输出有着线性关系的问题。但如果真实价格和决定因素的关系并不是如此简单,那我们该怎么办? 比如说,地段对于大户型和小户型的房屋有很大影响,然而对中等户型的房屋并没有太大影响。那我们该怎么在我们的模型中收集这种复杂的信息呢?
|
||||
然而,这个算法仅仅能用于处理一些简单的问题,就是那些输入和输出有着线性关系的问题。但如果真实价格和决定因素的关系并不是如此简单,那我们该怎么办?比如说,地段对于大户型和小户型的房屋有很大影响,然而对中等户型的房屋并没有太大影响。那我们该怎么在我们的模型中收集这种复杂的信息呢?
|
||||
|
||||
所以为了更加的智能化,我们可以利用不同的权重来多次运行这个算法,收集各种不同情况下的估价。
|
||||
|
||||
@@ -241,7 +240,7 @@ def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
|
||||
|
||||
这样我们相当于得到了更为准确的答案
|
||||
|
||||
# 神经网络是什么
|
||||
## 神经网络是什么
|
||||
|
||||

|
||||
|
||||
@@ -272,7 +271,7 @@ class LinearModel(torch.nn.Module):
|
||||
y_pred=self.linear(x)
|
||||
return y_pred
|
||||
'''
|
||||
线性模型所必须的前馈传播,即wx+b
|
||||
线性模型所必须的前馈传播,即 wx+b
|
||||
'''
|
||||
|
||||
model=LinearModel()
|
||||
@@ -299,21 +298,23 @@ y_test=model(x_test)
|
||||
print('y_pred=',y_test.data)
|
||||
```
|
||||
|
||||
# 由浅入深(不会涉及代码)
|
||||
## 由浅入深(不会涉及代码)
|
||||
|
||||
# 为什么不教我写代码?
|
||||
::: warning 😇 为什么不教我写代码?
|
||||
|
||||
因为你可能看这些基础知识感觉很轻松毫无压力,但是倘若附上很多代码,会一瞬间拉高这里的难度,虽然仅仅只是调包。
|
||||
|
||||
但是我还是会在上面贴上一点代码,但不会有很详细的讲解,因为很多都是调包,没什么好说的,如果你完全零基础,忽略这部分内容即可
|
||||
|
||||
:::
|
||||
|
||||
我们尝试做一个神奇的工作,那就是用神经网络来识别一下手写数字,听上去非常不可思议,但是我要提前说的一点是,图像也不过是数据的组合,每一张图片有不同程度的像素值,如果我们把每一个像素值都当成神经网络的输入值,然后经过一个黑盒,让他识别出一个他认为可能的数字,然后进行纠正即可。
|
||||
|
||||
机器学习只有在你拥有数据(最好是大量数据)的情况下,才能有效。所以,我们需要有大量的手写「8」来开始我们的尝试。幸运的是,恰好有研究人员建立了 [MNIST 手写数字数据库](https://link.zhihu.com/?target=http%3A//yann.lecun.com/exdb/mnist/),它能助我们一臂之力。MNIST 提供了 60,000 张手写数字的图片,每张图片分辨率为 18×18。即有这么多的数据。
|
||||
|
||||
```python
|
||||
(X_train, y_train), (X_test, y_test) = mnist.load_data()
|
||||
#这段是导入minist的方法,但是你看不到,如果你想看到的话需要其他操作
|
||||
#这段是导入 minist 的方法,但是你看不到,如果你想看到的话需要其他操作
|
||||
```
|
||||
|
||||
我们试着只识别一个数字 8
|
||||
@@ -345,7 +346,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||
现在唯一要做的就是用各种「8」和非「8」的图片来训练我们的神经网络了。当我们喂给神经网络一个「8」的时候,我们会告诉它是「8」的概率是 100% ,而不是「8」的概率是 0%,反之亦然。
|
||||
|
||||
# 仅此而已吗
|
||||
## 仅此而已吗
|
||||
|
||||
当数字并不是正好在图片中央的时候,我们的识别器就完全不工作了。一点点的位移我们的识别器就掀桌子不干了
|
||||
|
||||
@@ -355,7 +356,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||
在真实世界中,这种识别器好像并没什么卵用。真实世界的问题永远不会如此轻松简单。所以,我们需要知道,当「8」不在图片正中时,怎么才能让我们的神经网络识别它。
|
||||
|
||||
## 暴力方法:更多的数据和更深的网络
|
||||
### 暴力方法:更多的数据和更深的网络
|
||||
|
||||
他不能识别靠左靠右的数据?我们都给他!给他任何位置的图片!
|
||||
|
||||
@@ -371,7 +372,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||
一层一层堆叠起来,这种方法很早就出现了。
|
||||
|
||||
## 更好的方法?
|
||||
### 更好的方法?
|
||||
|
||||
你可以通过卷积神经网络进行进一步的处理
|
||||
|
||||
@@ -389,7 +390,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||

|
||||
|
||||
## 卷积是如何工作的
|
||||
### 卷积是如何工作的
|
||||
|
||||
之前我们提到过,我们可以把一整张图片当做一串数字输入到神经网络里面。不同的是,这次我们会利用<strong>平移不变性</strong>的概念来把这件事做得更智能。
|
||||
|
||||
@@ -405,7 +406,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||
换一句话来说,我们从一整张图片开始,最后得到一个稍小一点的数组,里面存储着我们图片中的哪一部分有异常。
|
||||
|
||||
## 池化层
|
||||
### 池化层
|
||||
|
||||
图像可能特别大。比如说 1024*1024 再来个颜色 RGB
|
||||
|
||||
@@ -429,7 +430,7 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||
我们也要感谢显卡,这项技术早就出现了但是一直算不了,有了显卡让这件事成为了可能。
|
||||
|
||||
## 作出预测
|
||||
### 作出预测
|
||||
|
||||
到现在为止,我们已经把一个很大的图片缩减到了一个相对较小的数组。
|
||||
|
||||
@@ -445,10 +446,10 @@ model.add(Activation('relu'))# 激活函数,你可以理解为加上这个东
|
||||
|
||||
比如说,第一个卷积的步骤可能就是尝试去识别尖锐的东西,而第二个卷积步骤则是通过找到的尖锐物体来找鸟类的喙,最后一步是通过鸟喙来识别整只鸟,以此类推。
|
||||
|
||||
# 结语
|
||||
## 结语
|
||||
|
||||
这篇文章仅仅只是粗略的讲述了一些机器学习的一些基本操作,如果你要更深一步学习的话你可能还需要更多的探索。
|
||||
|
||||
# 参考资料
|
||||
## 参考资料
|
||||
|
||||
[machine-learning-for-software-engineers/README-zh-CN.md at master · ZuzooVn/machine-learning-for-sof](https://github.com/ZuzooVn/machine-learning-for-software-engineers/blob/master/README-zh-CN.md#%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E6%A6%82%E8%AE%BA)
|
||||
|
||||
Reference in New Issue
Block a user