机器学习P10 从头到尾实现一个线性回归案例
Posted 脚踏实地的大梦想家
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习P10 从头到尾实现一个线性回归案例相关的知识,希望对你有一定的参考价值。
这里写自定义目录标题
(1)导入数据
问题引入:假设你是老板,要考虑在不同的城市开一家新店;
x_train
是不同城市的人口数量
y_train
是那个城市一家餐馆的利润
import math
import copy
import numpy as np
x_train = np.array([6.1101, 5.5277, 8.5186, 7.0032, 5.8598, 8.3829, 7.4764, 8.5781, 6.4862, 5.0546, 5.7107, 14.164, 5.734, 8.4084, 5.6407, 5.3794, 6.3654, 5.1301, 6.4296, 7.0708, 6.1891, 20.27, 5.4901, 6.3261, 5.5649, 18.945, 12.828, 10.957, 13.176, 22.203, 5.2524, 6.5894, 9.2482, 5.8918, 8.2111, 7.9334, 8.0959, 5.6063, 12.836, 6.3534, 5.4069, 6.8825, 11.708, 5.7737, 7.8247, 7.0931, 5.0702, 5.8014, 11.7, 5.5416, 7.5402, 5.3077, 7.4239, 7.6031, 6.3328, 6.3589, 6.2742, 5.6397, 9.3102, 9.4536, 8.8254, 5.1793, 21.279, 14.908, 18.959, 7.2182, 8.2951, 10.236, 5.4994, 20.341, 10.136, 7.3345, 6.0062, 7.2259, 5.0269, 6.5479, 7.5386, 5.0365, 10.274, 5.1077, 5.7292, 5.1884, 6.3557, 9.7687, 6.5159, 8.5172, 9.1802, 6.002, 5.5204, 5.0594, 5.7077, 7.6366, 5.8707, 5.3054, 8.2934, 13.394, 5.4369])
y_train = np.array([17.592, 9.1302, 13.662, 11.854, 6.8233, 11.886, 4.3483, 12., 6.5987, 3.8166, 3.2522, 15.505, 3.1551, 7.2258, 0.71618, 3.5129, 5.3048, 0.56077, 3.6518, 5.3893, 3.1386, 21.767, 4.263, 5.1875, 3.0825, 22.638, 13.501, 7.0467, 14.692, 24.147, -1.22, 5.9966, 12.134, 1.8495, 6.5426, 4.5623, 4.1164, 3.3928, 10.117, 5.4974, 0.55657, 3.9115, 5.3854, 2.4406, 6.7318, 1.0463, 5.1337, 1.844, 8.0043, 1.0179, 6.7504, 1.8396, 4.2885, 4.9981, 1.4233, -1.4211, 2.4756, 4.6042, 3.9624, 5.4141, 5.1694, -0.74279, 17.929, 12.054, 17.054, 4.8852, 5.7442, 7.7754, 1.0173, 20.992, 6.6799, 4.0259, 1.2784, 3.3411, -2.6807, 0.29678, 3.8845, 5.7014, 6.7526, 2.0576, 0.47953, 0.20421, 0.67861, 7.5435, 5.3436, 4.2415, 6.7981, 0.92695, 0.152, 2.8214, 1.8451, 4.2959, 7.2029, 1.9869, 0.14454, 9.0551, 0.61705])
(2)画出城市人口与利润图
通过 python 包 matplotlib.pyplot
画图
import matplotlib.pyplot as plt
plt.scatter(x_train, y_train, marker='x', c='g')
plt.title("利润*10000/人口数量*10000")
plt.ylabel('利润*10000')
plt.xlabel('人口数量*10000')
plt.show()
(3)计算损失值
已知模型为:
f
w
⃗
,
b
(
x
⃗
(
i
)
)
=
w
⃗
⋅
x
⃗
(
i
)
+
b
f_\\vecw,b(\\vecx^(i)) = \\vecw·\\vecx^(i)+b
fw,b(x(i))=w⋅x(i)+b
损失函数为:
c
o
s
t
(
i
)
=
(
f
w
⃗
,
b
(
x
⃗
(
i
)
)
−
y
(
i
)
)
2
cost^(i) = (f_\\vecw,b(\\vecx^(i))-y^(i))^2
cost(i)=(fw,b(x(i))−y(i))2
总损失函数为:
J
(
w
⃗
.
b
)
=
1
2
m
∑
i
=
0
m
−
1
c
o
s
t
(
i
)
J(\\vecw.b) = \\frac 1 2m \\sum ^m-1 _i=0 cost^(i)
J(w.b)=2m1i=0∑m−1cost(i)
程序实现如下:
def compute_cost(x,y,w,b):
m = x.shape[0]
total_cost = 0.
for i in range(m):
f_wb = np.dot(w,x[i]) + b
cost = (f_wb - y[i]) ** 2
total_cost += cost
total_cost = total_cost / (2 * m)
return total_cost
(4)计算梯度下降
梯度下降公式为:
repeat until convergence:
0000
b
:
=
b
−
α
∂
J
(
w
,
b
)
∂
b
0000
w
:
=
w
−
α
∂
J
(
w
,
b
)
∂
w
\\beginalign*& \\textrepeat until convergence: \\; \\lbrace \\newline \\; & \\phantom 0000 b := b - \\alpha \\frac\\partial J(w,b)\\partial b \\newline \\; & \\phantom 0000 w := w - \\alpha \\frac\\partial J(w,b)\\partial w \\; & \\newline & \\rbrace\\endalign*
repeat until convergence:0000b:=b−α∂b∂J(w,b)0000w:=w−α∂w∂J(w,b)
详解 gradient
部分为:
∂
J
(
w
,
b
)
∂
b
=
1
m
∑
i
=
0
m
−
1
(
f
w
,
b
(
x
(
i
)
)
−
y
(
i
)
)
∂
J
(
w
,
b
)
∂
w
=
1
m
∑
i
=
0
m
−
1
(
f
w
,
b
(
x
(
i
)
)
−
y
(
i
)
)
x
(
i
)
\\frac\\partial J(w,b)\\partial b = \\frac1m \\sum\\limits_i = 0^m-1 (f_w,b(x^(i)) - y^(i)) \\\\ \\frac\\partial J(w,b)\\partial w = \\frac1m \\sum\\limits_i = 0^m-1 (f_w,b(x^(i)) -y^(i))x^(i)
∂b∂J(w,b)=m1i=0∑m−1(fw,b(x(i))−y(i))∂w∂J(w,b)=m1i=0∑m−1(f机器学习笔记
机器学习笔记(三)
文章目录
线性模型简介
线性模型最简单的案例是最小二乘法:
在机器学习的术语中,当预测值为连续值时,称为“回归问题”,离散值时为“分类问题”。本篇先从线性回归任务开始,接着讨论分类和多分类问题。
线性回归
线性回归问题就是试图学到一个线性模型尽可能准确地预测新样本的输出值,有时这些输入的属性值并不能直接被我们的学习模型所用,需要进行相应的处理,对于连续值的属性,一般都可以被学习器所用,有时会根据具体的情形作相应的预处理。
当输入属性只有一个的时候,就是最简单的情形,也就是我们高中时最熟悉的“最小二乘法”(Euclidean distance),首先计算出每个样本预测值与真实值之间的误差并求和,通过最小化均方误差MSE,使用求偏导等于零的方法计算出拟合直线y=wx+b的两个参数w和b,计算过程如下图所示:
当输入属性有多个的时候,例如对于一个样本有d个属性(x1,x2…xd),y,则y=wx+b需要写成:
通常对于多元问题,常常使用矩阵的形式来表示数据。在本问题中,将具有m个样本的数据集表示成矩阵X,将系数w与b合并成一个列向量,这样每个样本的预测值以及所有样本的均方误差最小化就可以写成下面的形式:
同样地,我们使用最小二乘法对w和b进行估计,令均方误差的求导等于0,需要注意的是,当一个矩阵的行列式不等于0时,我们才可能对其求逆,因此对于下式,我们需要考虑矩阵(X的转置*X)的行列式是否为0,若不为0,则可以求出其解,若为0,则需要使用其它的方法进行计算,书中提到了引入正则化,此处不进行深入。
另一方面,有时像上面这种原始的线性回归可能并不能满足需求,例如:y值并不是线性变化,而是在指数尺度上变化。这时我们可以采用线性模型来逼近y的衍生物,例如lny,这时衍生的线性模型如下所示,实际上就是相当于将指数曲线投影在一条直线上,如下图所示:
更一般地,考虑所有y的衍生物的情形,就得到了“广义的线性模型”(generalized linear model),其中,g(*)称为联系函数(link function)。
线性几率回归
回归就是通过输入的属性值得到一个预测值,利用上述广义线性模型的特征,是否可以通过一个联系函数,将预测值转化为离散值从而进行分类呢?线性几率回归正是研究这样的问题。对数几率引入了一个对数几率函数(logistic function),将预测值投影到0-1之间,从而将线性回归问题转化为二分类问题。
注意这是将输入的数值映射到了0或者1上面了,也就是说实际上是将一个回归问题转换为了一个二元的分类问题:
若将y看做样本为正例的概率,(1-y)看做样本为反例的概率,则上式实际上使用线性回归模型的预测结果器逼近真实标记的对数几率。因此这个模型称为“对数几率回归”(logistic regression),也有一些书籍称之为“逻辑回归”。下面使用最大似然估计的方法来计算出w和b两个参数的取值,下面只列出求解的思路,不列出具体的计算过程。
以上是关于机器学习P10 从头到尾实现一个线性回归案例的主要内容,如果未能解决你的问题,请参考以下文章