1、线性回归
1.1、数据收集
data = np.array([[1, 2.5], [2, 3.3], [2.5, 3.8], [3, 4.5], [4, 5.7], [5, 6]])
1.2、数据可视化
用图打出来看看他们之间的关系,发现他们之间大致是一个线性关系,可以试着用一元线性回归去拟合(fit)他们之间的关系。
1.3、数学模型
一元线性回归公式
y=ax+b+ε
y 为应变量 dependent variable
x 为自变量 independent variable
a 为斜率 coeffient
b 为截距 intercept
ε (读作epsilon)为误差,正态分布
线性回归的目标是,找到一组a和b,使得ε最小
y^=ax+b
ε=y−y^
y^ 读作y hat,也有人读作y帽子。这里的帽子一般表示估计值,用来区别真实值y。
下图可以更好的帮助你理解。
黑色的点为观测样本,即y=ax+b+ε
x红色的线为回归线,即yˆ=ax+b
x蓝色的线段为误差,即ε=y−yˆ
1.4、损失函数 Cost Function
首先解释下什么是方差:
方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。
概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。
统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。
在许多实际问题中,研究方差即偏离程度有着重要意义。
SSE(Sum of Square Error)是总的方差,MSE(Mean Square Error)是方差的平均值。
而这里的损失函数,用的是0.5 * MSE。即:
注:损失函数是针对参数a和b的函数,y和yˆy^ 其实都是已知的。
1.5、优化方法 Optimization Function——梯度下降法
优化方法,就是算损失的方向。或者说,当我的参数变化的时候,我的损失是变大了还是变小了。如果a变大了,损失变小了。那么,说明a增大这个方向是正确的,我们可以朝着这个方向继续小幅度的前进。反之,就应该考虑往相反的方向试试看。因为每个参数(a和b)都是一维的,所以,所谓的方向,无非就是正负符号。
这里,我们需要用偏微分的方法,得到损失函数的变化量。即:
1.5、算法流程
2、逻辑回归
2.1、数据收集
# 加载数据
def loaddata(self, filename, delimeter):
data = np.loadtxt(filename, delimiter=delimeter)
print('Dimensions: ', data.shape)
return data
2.2、数据标记为正负样本
2.3、模型函数
这里,我们的y值,并非连续的。要么y=0y=0,要么y=1y=1。所以,和线性回归相比,我们要把y控制在0和1之间。这时,前人引进了sigmoid函数。当x大于0时,y无限接近于1;当x小于0时,y无限接近于0;当x等于0时,y=0.5。
![在这里插入图片描述](
def sigmoid(z):
s = 1/(1+np.exp(-z))
s = s.reshape(s.shape[0],1)
return s
我们可以把这个函数画出来看看。
def draw_sigmoid():
x = np.arange(-6, 6, .01)
y = sigmoid(x)
plt.plot(x, y, color='red', lw=2)
plt.show()
draw_sigmoid()
最终,我们的模型函数是:
def model(theta, X):
z = np.sum(theta.T * X, axis=1)
return sigmoid(z)
2.4、损失函数
向量化的损失函数(矩阵形式)
2.5、优化函数