发布于2021-07-25 06:15 阅读(689) 评论(0) 点赞(5) 收藏(3)
我非常喜欢吃披萨,每次吃披萨的时候我都记录下来披萨的直径和价格,有一次和朋友们聊天,讨论多大的披萨大概需要花多少钱的话题,我想了想,这个我有发言权啊。。。因为我吃的多啊,有经验啊,其实机器和人是一样的,给机器足够的样本数据,当机器再看到一个陌生的新数据的时候,就会根据以往的规律预测出结果。
我找到了最近5次的外卖订单:
序号 | 直径(寸) | 价格(元) |
---|---|---|
1 | 6 | 7 |
2 | 8 | 9 |
3 | 10 | 13 |
4 | 14 | 17.5 |
5 | 18 | 18 |
借助motplotlib对训练数据进行可视化:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = "SimHei" # 设置显示中文,防止乱码
plt.style.use('ggplot') # 使用‘ggplot样式’ 会好看一些
# sklearn中习惯把特征向量的矩阵命名为X
# 大写字母表示矩阵,小写字母表示向量 一种习惯
X = np.array([6,8,10,12,14]).reshape((-1,1))
# reshape(-1,1) -1表示,将np.array对象转换成1列,行数自动转换,本例中有五个元素,最后转换成5行一列的矩阵
y = np.array([7,9,13,17.5,18])
plt.plot(X,y,'bo') # 画图 ‘bo’表示 [color=blue][market='o'][linstyle='-']
plt.title("披萨直径与价格散点图") # 图表标题
plt.xlabel("直径(寸)") # 图表横坐标标记
plt.ylabel("价格(元)") # 图表纵坐标标记
plt.grid(True) # 显示背景网格
plt.show() # 显示图像
从上面的图中可以看的出来,披萨的直径与价格有正相关关系,这个结果和我平时吃披萨时候的经验是相符的
from sklearn.linear_model import LinearRegression
model = LinearRegression() # 创建一个线性回归实例
model.fit(X,y) # 用训练数据拟合模型
test_pizza = np.array([[12]]) # 新建一个测试数据,披萨的直径
predicted_price = model.predict(test_pizza)[0] # 返回一个np.array类型的测试结果集
print("12寸的披萨应该卖%.2f元"%predicted_price)
"""
OUT:
12寸的披萨应该卖15.95元
"""
简单线性模型假设响应变量(输入)和解释变量(输出)之间存在线性关系
LinearRegression是sklearn众多模型中的一种,所有的模型都实现了fit和predict方法,fit用于学习模型的参数,predict用来预测一个新的输入,给出一个预测的输出。
对于简单线性回归来说:
y
=
α
+
β
x
y = \alpha + \beta x
y=α+βx
x 是解释变量就是pizza实例中的直径,y是预测值,是pizza实例中的价格,
α
\alpha
α和
β
\beta
β就是模型需要训练的参数,如果有一些数学基础肯定知道,
α
\alpha
α就是直线的截距,
β
\beta
β就是直线的斜率,这两个参数直接影响线在平面中的位置。
对于模型来说可能存在多条直线,那么哪一条是最优的,这个最优的直线应该怎么找到?
对于简单线性回归使用残差平方和(RSS)作为损失函数,实例点到训练直线的垂直距离的和平方和作为残差平方和。
代价函数,也是损失函数,它用于定义和衡量一个模型的误差
残差平方和公式:
S
S
r
e
s
=
∑
i
=
1
n
(
y
i
−
f
(
x
i
)
)
2
SS_res = \sum_{i=1}^{n} (y_i-f(x_i))^2
SSres=∑i=1n(yi−f(xi))2
np.sum((model.predict(X)-y)**2)
残差平方和计算公式
简单线性回归由
y
=
α
+
β
x
y = \alpha + \beta x
y=α+βx给出,我们的目标是计算损失函数的最小值得出
α
\alpha
α和
β
\beta
β
为了计算
α
\alpha
α和
β
\beta
β
首先熟悉几个数学概念
方差 方差描述一组数据的偏离程度,如果方差为0,那么这组数据都相等,方差小意味着这组数据都接近均值,如果数据中有偏离均值很远的值那么方差会很大
v
a
r
(
x
)
=
∑
i
=
1
n
(
x
i
−
x
‾
)
2
n
−
1
var(x) = \frac{\sum_{i=1}^{n}(x_i- \overline x)^2}{n-1}
var(x)=n−1∑i=1n(xi−x)2
x
‾
\overline x
x : 表示x的均值
x
i
x_i
xi : 表示第i个值
n
n
n : 表示x的数据总量
肯定有人会问,为什么分母是n-1 不是n,这是贝塞尔校正,纠正了样本中总体方差估计的偏差
计算披萨直径的方差 方法一
X
"""
array([[ 6],
[ 8],
[10],
[14],
[18]])
"""
(np.sum((X - X.mean())**2)) / (X.shape[0] - 1 )
# 23.2
计算披萨直径的方差 方法二
np.var(X,doff=1) # doff是贝塞尔校正
# 23.2
协方差 协方差用于衡量两个变量如何一同变化
如果变量一起增加,协方差为正
如果一个变量增加一个变量减少,协方差为负
如果一个变量的变化不会影响另一个变量,协方差为0
方式一 使用协方差公式计算
c o v ( x , y ) = ∑ i − 1 n ( x i − x ‾ ) ( y i − y ‾ ) n − 1 cov(x,y)=\frac {\sum_{i-1}^{n}(x_i-\overline x)(y_i-\overline y) }{n-1} cov(x,y)=n−1∑i−1n(xi−x)(yi−y)
x,y : 必须都是一维向量
x
‾
\overline x
x : x的均值
y
‾
\overline y
y : y的均值
n:样本数量
i :第i个样本
np.multiply((X - np.mean(X)).transpose(),(y-np.mean(y))).sum() / (X.shape[0] - 1)
# 公式可能比较长,但是并不复杂,numpy的广播特性真的超级好用
22.65
方式二 直接使用np.cov()
# np.cov(x,y)
np.cov(X.transpose(),y)[0][1]
22.65
β = c o v ( x , y ) v a r ( x ) \beta= \frac {cov(x,y)}{var(x)} β=var(x)cov(x,y)
α = y ‾ − β x ‾ \alpha=\overline y - \beta\overline x α=y−βx
y ‾ \overline y y是y的均值; x ‾ \overline x x是x的均值
( x ‾ \overline x x, y ‾ \overline y y)是质心的坐标,模型必须经过这个点
β = 22.65 23.2 ≈ 0.98 \beta= \frac {22.65}{23.2}\approx0.98 β=23.222.65≈0.98
α = y ‾ − β x ‾ ≈ 1.92 \alpha=\overline y - \beta\overline x\approx1.92 α=y−βx≈1.92
首先来一组测试数据:
序号 | 直径(寸) | 真实价格(元) | 预测价格 |
---|---|---|---|
1 | 8 | 11 | 9.77586207 |
2 | 9 | 8.5 | 10.75215517 |
3 | 11 | 15 | 12.70474138 |
4 | 16 | 18 | 17.5862069 |
5 | 12 | 11 | 13.68103448 |
x_test = np.array([8,9,11,16,12]).reshape((-1,1))
y_test = model.predict(x_test)
y_test
# OUT
"""
array([ 9.77586207, 10.75215517, 12.70474138, 17.5862069 , 13.68103448])
"""
方式一
使用衡量方法评估模型的预测能力,R方决定系数等于皮尔森积差相关系数的平方。
R方必须是0~1之间的数
S S t o t = ∑ i = 1 n ( y i − y ‾ ) 2 SS_{tot} = \sum_{i=1}^{n}(y_i - \overline y)^2 SStot=∑i=1n(yi−y)2
y
i
y_i
yi : 第i个观测值
y
‾
\overline y
y : 观测值的平均值
y = np.array([11,8.5,15,18,11])
np.sum((y-np.mean(y))**2)
# out
56.8
S
S
r
e
s
=
∑
i
=
1
n
(
y
i
−
f
(
x
i
)
)
2
SS_{res}=\sum_{i=1}^{n}(y_i - f(x_i))^2
SSres=∑i=1n(yi−f(xi))2
y
i
y_i
yi : 第i个观测值
f
(
x
i
)
f(x_i)
f(xi) : 对应的预测值
np.sum((y-y_test)**2)
#out
19.20
R 2 = 1 − S S r e s S S t o t = 1 − 19.20 56.8 ≈ 0.66 R^2=1-\frac{SS_{res}}{SS_{tot}}=1-\frac{19.20}{56.8}\approx0.66 R2=1−SStotSSres=1−56.819.20≈0.66
方式二 使用模型的score方法
X = np.array([6,8,10,14,18]).reshape([-1,1])
y = np.array([7,9,13,17.5,18])
model = LinearRegression()
model.fit(X,y)
x_test = np.array([8,9,11,16,12]).reshape((-1,1))
y_test = np.array([11,8.5,15,18,11])
model.score(x_test,y_test)
# OUT
0.6620052929422553
原文链接:https://blog.csdn.net/kobe_okok/article/details/119009085
作者:小酷狗
链接:http://www.pythonpdf.com/blog/article/426/4907f2bb4b360175149a/
来源:编程知识网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!