2019-12-28
线性回归是机器学习的构建基础。它几乎用于每个单独的主流机器学习算法之中,所以对它的理解有助于你掌握多数主流机器学习算法。出于我们的热情,理解线性回归和线性代数,是编写你自己的机器学习算法,以及跨入机器学习前沿,使用当前最佳的处理过程的第一步。由于处理过程的优化和硬件架构的改变。用于机器学习的方法论也会改变。最近出现的神经网络,使用大量 GPU 来完成工作。你想知道什么是神经网络的核心吗?你猜对了,线性代数。
如果你能记得,最佳拟合直线的斜率m
:
是的,我们会将其拆成片段。首先,进行一些导入:
from statistics import mean
import numpy as np
我们从statistics
导入mean
,所以我们可以轻易获取列表的均值。下面,我们使numpy as np
,所以我们可以其创建 NumPy 数组。我们可以对列表做很多事情,但是我们需要能够做一些简单的矩阵运算,它并不对简单列表提供,所以我们使用 NumPy。我们在这个阶段不会使用太复杂的 NumPy,但是之后 NumPy 就会成为你的最佳伙伴。下面,让我们定义一些起始点吧。
xs = [1,2,3,4,5]
ys = [5,4,6,5,6]
所以这里有一些我们要使用的数据点,xs
和ys
。你可以认为xs
就是特征,ys
就是标签,或者他们都是特征,我们想要建立他们的联系。之前提到过,我们实际上把它们变成 NumPy 数组,以便执行矩阵运算。所以让我们修改这两行:
xs = np.array([1,2,3,4,5], dtype=np.float64)
ys = np.array([5,4,6,5,6], dtype=np.float64)
现在他们都是 NumPy 数组了。我们也显式声明了数据类型。简单讲一下,数据类型有特性是属性,这些属性决定了数据本身如何储存和操作。现在它不是什么问题,但是如果我们执行大量运算,并希望他们跑在 GPU 而不是 CPU 上就是了。
将其画出来,他们是:
[图片上传失败...(image-3ee2ef-1577535495213)]
现在我们准备好构建函数来计算m
,也就是我们的直线斜率:
def best_fit_slope(xs,ys):
return m
m = best_fit_slope(xs,ys)
好了。开个玩笑,所以这是我们的框架,现在我们要填充了。
我们的第一个逻辑就是计算xs
的均值,再乘上ys
的均值。继续填充我们的框架:
def best_fit_slope(xs,ys):
m = (mean(xs) * mean(ys))
return m
目前为止还很简单。你可以对列表、元组或者数组使用mean
函数。要注意我这里使用了括号。Python 的遵循运算符的数学优先级。所以如果你打算保证顺序,要显式使用括号。要记住你的运算规则。
下面我们需要将其减去x*y
的均值。这既是我们的矩阵运算mean(xs*ys)
。现在的代码是:
def best_fit_slope(xs,ys):
m = ( (mean(xs)*mean(ys)) - mean(xs*ys) )
return m
我们完成了公式的分子部分,现在我们继续处理的分母,以x
的均值平方开始:(mean(xs)*mean(xs))
。Python 支持** 2
,能够处理我们的 NumPy 数组的float64
类型。添加这些东西:
def best_fit_slope(xs,ys):
m = ( ((mean(xs)*mean(ys)) - mean(xs*ys)) /
(mean(xs)**2))
return m
虽然根据运算符优先级,向整个表达式添加括号是不必要的。我这里这样做,所以我可以在除法后面添加一行,使整个式子更加易读和易理解。不这样的话,我们会在新的一行得到语法错误。我们几乎完成了,现在我们只需要将x
的均值平方和x
的平方均值(mean(xs*xs)
)相减。全部代码为:
def best_fit_slope(xs,ys):
m = (((mean(xs)*mean(ys)) - mean(xs*ys)) /
((mean(xs)**2) - mean(xs*xs)))
return m
好的,现在我们的完整脚本为:
from statistics import mean
import numpy as np
xs = np.array([1,2,3,4,5], dtype=np.float64)
ys = np.array([5,4,6,5,6], dtype=np.float64)
def best_fit_slope(xs,ys):
m = (((mean(xs)*mean(ys)) - mean(xs*ys)) /
((mean(xs)**2) - mean(xs**2)))
return m
m = best_fit_slope(xs,ys)
print(m)
# 0.3