“30分钟”带你走进线性回归的世界,轻松学习互联网营销推荐算法!

news2024/11/16 8:34:46

 

前言

本章主要介绍用于推荐系统的算法-线性回归算法的推导介绍,文章思路如下:由机器学习介绍,到监督学习,并重点介绍监督学习中回归问题里面的线性回归问题及推导。

可能需要大家具备一定的统计学、高数相关知识。

一、由机器学习引出

1.1 机器学习的开端

1952年,IBM的Arthur Samuel(被誉为“机器学习之父”)设计了一款可以学习的西洋跳棋程序

它能通过观察棋子的走位来构建新的模型,并用其提高自己的下棋技巧

Samuel和这个程序进行多场对弈发现,随着时间的推移,程序的棋艺变得越来越好。

1.2 学习?与机器学习

从人说起,①学习理论,从实践中总结;②在理论上推导,在实践中检验;③通过各种手段获取知识或技能的过程

那么机器怎么学习?

  • 处理某个特定的任务,以大量的“经验”为基础
  • 对任务完成的好坏,给予一定的评判标准
  • 通过分析经验数据,任务完成得更好了

1.3 机器学习算法的分类

机器学习是关于计算机基于数据分布构建出概率统计模型,并运用模型对数据进行分析与预测的方法。按照学习数据分布的方式的不同,机器学习的主要形式有监督学习、无监督学习、半监督学习及强化学习:

其他细分,如下图所示:

1.4 机器学习建模流程

  1. 明确业务问题

明确业务问题是机器学习的先决条件,这里需要抽象出现实业务问题的解决方案:需要学习什么样的数据作为输入,目标是得到什么样的模型做决策作为输出。

  1. 数据选择

数据决定了机器学习结果的上限,而算法只是尽可能逼近这个上限。数据的质量决定了模型的最终效果。

  1. 特征工程

特征工程就是将原始数据加工转化为模型有用的特征,包括数据预处理、特征提取

  1. 模型训练

模型训练是选择模型学习数据分布的过程。这过程还需要依据训练结果调整算法的(超)参数,使得结果变得更加优良。

  1. 模型评估

模型学习的目的使学到的模型对新数据能有很好的预测能力(泛化能力)。现实中通常由训练误差及测试误差评估模型的训练数据学习程度及泛化能力

  1. 模型评估

决策是机器学习最终目的,对模型预测信息加以分析解释,并应用于实际的工作领域。

以上,具体不展开说明,于下回分解

1.5 监督学习介绍

有监督学习使用有标签的训练数据,“监督”可以理解为已经知道训练样本(输入数据)中期待的输出信号(标签)。

监督学习过程是,先为机器学习算法提供打过标签的训练数据以拟合预测模型,然后用该模型对未打过标签的新数据进行预测。

监督学习的分类

监督学习问题主要可以划分为两类,即分类问题回归问题

  • 分类问题预测数据属于哪一类别 ——离散
  • 回归问题根据数据预测一个数值 ——连续

分类问题

分类问题预测数据所属的类别,分类的例子包括垃圾邮件检测、客户流失预测、情感分析、犬种检测等。

例如:根据肿瘤特征判断良性还是恶性,得到的是结果是“良性”或者“恶性”,是离散的。

相关分类(Classfication)算法:

  • K近邻(K-NN)
  • 朴素贝叶斯(Naive Bayes)
  • 逻辑回归(Logistic Regression)
  • 支持向量机(SVM)
  • 决策树(Decision Trees)

回归问题

回归问题根据先前观察到的数据预测数值,回归的例子包括房价预测、股价预测、身高-体重预测等。

例如:预测房价,根据样本集拟合出一条连续曲线。

相关回归(Regression)算法:

  • 线性回归(Linear Regression)
  • 多项式回归(Polnomial Regression)
  • 岭/Lasson回归(Ridge/Lasson Regression)

二、回归问题之线性回归(Linear Regression)

2.1 由问题回归问题引入

举个例子:我们需要分析下银行贷款额度受哪些因素影响?

经过特征工程后提取特征(工资和年龄),共2个特征,影响银行贷款,如下数据:

工资

年龄

额度

4000

25

20000

8000

30

70000

5000

28

35000

7500

33

50000

12000

40

85000

目标:预测银行会贷给我多少钱(标签)

考虑:工资和年龄都会影响贷款的结果,那么他们各自有多大的影响?(参数)

拟合方程

 

误差项-损失函数

 

 

 

参数求解

 

 

 

 

2.2 最小二乘法

 

 

 

2.3 梯度下降

2.3.1 引入

 

2.3.2 梯度下降介绍

 

 

α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

(5)梯度下降思想

中心思想为:迭代地调整参数从而使成本函数最小化

首先使用一个随机的θ值(随机初始化),然后逐步改进,每次踏出一步,每一步都尝试降低一点成本函数(如MSE),直到算法收敛出一个最小值。学习步长与成本函数的斜率成正比,因此,当参数接近最小值时,步长逐渐变小

若学习率太低,算法需要经过大量迭代才能收敛

若学习率太高,则有可能比之前的起点还要高,这会导致算法发散,值越来越大

(6)梯度下降的两个主要挑战


该图显示了梯度下降的两个主要挑战:

  • 梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解
  • 如果损失函数是凸函数,梯度下降得到的解就不一定是全局最优解

2.3.3 梯度下降与正规方程对比

有了梯度下降这样一个优化算法,回归就有了"自动学习"的能力.

梯度下降

正规方程(如最小二乘法)

需要选择学习率

不需要

需要迭代求解

一次运算得出

特征数量较大可以使用

需要计算方程,时间复杂度高O(n3)

2.3.4 梯度下降分类

梯度下降法有三种不同的形式:批量梯度下降(Batch Gradient Descent)、随机梯度下降(Stochastic Gradient Descent)以及小批量梯度下降(Mini-Batch Gradient Descent)

 

批量梯度下降

(1)对目标函数求偏导:

(2)每次迭代对参数进行更新:

容易得到最优解,但是由于每次考虑所有样本,速度很慢

随机梯度下降

它的具体思路是:算法中对Theta的每次更新不需要再全部遍历一次整个样本,只需要查看一个训练样本进行更新,之后再用下一个样本进行下一次更新,像批梯度下降一样不断迭代更新。

总结:每次找一个样本,迭代速度快,但不一定每次都朝着收敛的方向

小批量梯度下降法

每次更新选择一小部分数据来算,实用!

2.4 其他:牛顿和拟牛顿法

牛顿法(Netwton method)

 

拟牛顿法(quasi Newton method)

  • 牛顿法需要求解目标函数的海塞矩阵的逆矩阵,从而大大简化了计算过程
  • 拟牛顿法通过正定矩阵近似海塞矩阵的逆矩阵,从而大大简化了计算过程

 

三、算法实现

3.1 最小二乘法

准备数据:data.csv

代码实现:

import numpy as np
import matplotlib.pyplot as plt

# 1、导入数据
points = np.genfromtxt('data.csv', delimiter=',')
# 提取points中的两列数据,分别作为x,y
x = points[:, 0]
y = points[:, 1]

# 用plt画出散点图
plt.scatter(x, y)
plt.show()

# 2. 定义损失函数
# 损失函数是系数的函数,另外还要传入数据的x,y
def compute_cost(w, b, points):
    total_cost = 0
    M = len(points)
    
    # 逐点计算平方损失误差,然后求平均数
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        total_cost += ( y - w * x - b ) ** 2
    
    return total_cost/M

# 先定义一个求均值的函数
def average(data):
    sum = 0
    num = len(data)
    for i in range(num):
        sum += data[i]
    return sum/num

# 3.定义核心拟合函数
def fit(points):
    M = len(points)
    x_bar = average(points[:, 0])
    
    sum_yx = 0
    sum_x2 = 0
    sum_delta = 0
    
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_yx += y * ( x - x_bar )
        sum_x2 += x ** 2
    # 根据公式计算w
    w = sum_yx / ( sum_x2 - M * (x_bar**2) )
    
    for i in range(M):
        x = points[i, 0]
        y = points[i, 1]
        sum_delta += ( y - w * x )
    b = sum_delta / M
    
    return w, b

# 4.测试
w, b = fit(points)

print("w is: ", w)
print("b is: ", b)

cost = compute_cost(w, b, points)

print("cost is: ", cost)

# 5.画出拟合曲线
plt.scatter(x, y)
# 针对每一个x,计算出预测的y值
pred_y = w * x + b

plt.plot(x, pred_y, c='r')
plt.show()

图形如下:

3.2 梯度下降

下面通过实例来应用梯度下降算法找到y=x^2+1的最小值。

算法流程:

  1. 定义自变量初始值x1
  2. 函数在x1处求梯度,参数更新(找最陡峭的下一点x2)
  3. 函数在x2处求梯度,参数更新(找最陡峭的下一点x3)
  4. 不断迭代,直到约等最小值(到达谷底)
#### 1-1 加载依赖库,定义函数
import numpy as np
import matplotlib.pyplot as plt
# 定义 y=x^2+1 函数
def function(x):
    x = np.array(x)
    y = x ** 2 + 1
    return y

####1-2 定义参数的初始值
#指定自变量更新的次数(迭代的次数)
epochs = 50
# 指定学习率的值
lr = 0.1
# 对自变量的值进行初始化
xi = -18

####1-3 求解梯度,更新参数,不断训练。
# 求取函数的梯度值
def get_gradient(x):
    gradient = 2 * x
    return gradient
# 用于存储每次自变量更新后的值
trajectory = []
# 利用梯度下降算法找到使得函数取最小值的自变量的值x_star
def get_x_star(xi):
    for i in range(epochs):
        trajectory.append(xi)
        xi = xi - lr * get_gradient(xi)
    x_star = xi
    return x_star
# 运行get_x_star函数
get_x_star(xi)


#####1-4 进行显示
x1 = np.arange(-20, 20, 0.1)
y = function(x1)
# 画出函数图像
plt.plot(x1, y)
x_trajectory = np.array(trajectory)
y_trajectory = function(trajectory)
# 画图更新过程中的自变量与其对应的函数的值
plt.scatter(x_trajectory, y_trajectory)
plt.show()

显示图形如下:

四、基于sklearn的线性回归应用

线性回归是处理一个或者多个自变量和因变量之间的关系,然后进行建模的一种回归分析方法。如果只有一个自变量的情况称为一元线性回归,如果有两个或两个以上的自变量,就称为多元回归。在sklearn中linear_model 模块几乎集成了所有线性模型,采用linear_model 中的可以实现linearRegression线性回归。

案例:找出房屋面积关于房价的拟合直线y=ax+b,根据房屋面积进行房价的预测。

准备数据:

代码如下:

#1-1导入相应的数据模块
import sys
import matplotlib.pyplot as plt
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression

# 从csv文件中读取数据,分别为:X列表和对应的Y列表
def get_data(file_name):
    # 1. 用pandas读取csv
    data = pd.read_csv(file_name)
    print('data', data)
    # 2. 构造X列表和Y列表
    X_parameter = []
    Y_parameter = []
    for single_square_feet,single_price_value in zip(data['square_feet'],data['price']):
        X_parameter.append([float(single_square_feet)])
        Y_parameter.append([float(single_price_value)])
    return X_parameter,Y_parameter

# 1-2导入相应的基础训练数据集
X,Y = get_data('./house_price.csv')

# 1-3 绘图
regr = LinearRegression() # 构造回归对象
regr.fit(X,Y)
predict_outcome = regr.predict([[700]]) # 获取预测值,预测700平方英尺大小的房子的房价

# 预测线信息
print(regr.intercept_) # 截距值
print(regr.coef_) # 回归系数(斜率值)
print(predict_outcome) # 预测值

plt.scatter(X,Y,color = 'blue') # 绘出已知数据散点图
plt.plot(X,regr.predict(X),color = 'red',linewidth = 4) # 绘出预测直线
plt.title('Predict the house price')
plt.xlabel('square feet')
plt.ylabel('price')
plt.show() # 展示图像

效果如下:

梯度下线的应用

# 随机梯度下降
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler

# 归一化数据
std = StandardScaler()
std.fit(X_train)
X_train_std = std.transform(X_train)
X_test_std = std.transform(X_test)

# n_iter代表浏览多少次,默认是5
sgd_reg = SGDRegressor(n_iter=100)
sgd_reg.fit(X_train_std, y_train)
sgd_reg.score(X_test_std, y_test)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/593965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s入门(一)之pod创建、label使用、污点、亲和性、RS

一、创建一个pod [rootmaster01 ~]# kubectl create ns prod [rootmaster01 ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata:name: pod-demonamespace: prodlabels:app: myapp spec:containers:- name: test1image: busybox:latestcommand:- "/bin/sh"- "…

问题记录 bug1-系统上电挂载异常分区,df与du命令查看文件使用大小显示不一样

linux磁盘分区 在Linux中,一切皆目录,每一块硬盘分区对应Linux的一个目录,所以我们可以通过管理目录来管理硬盘分区,而将硬盘分区与文件目录关联的操作就称为“挂载”【mount】,反之为“卸载”【unmount】 emmc&…

C高级 text

1.从命令行传参传入两个整数,整数1代表从整数几开始求和,整数2代表求和到整数几为止 2.打印99乘法表 3.输入年月日,计算是该年的第几天 1. 2. 3.

Linux进程基础

进程指正在运行的程序,如下图示,是资源分配的最小单位,可以通过“ps ”或“top”等命令查看正 在运行的进程,线程是系统的最小调度单位,一个进程可以拥有多个线程,同一进程里的线程可以共享此 进程的同一资…

Server版支持即将到期,Jira和Confluence如何迁移?(2)

到2024年2月,Atlassian将终止对Server产品及插件的所有支持。是时候制定您的迁移计划了——Atlassian为您提供两种迁移选择,一是本地部署的数据中心版本,中国用户25人以上即可使用,二是云版。作为Atlassian全球白金合作伙伴&#…

Markdown可以在线编辑吗?这个办法很好用

Markdown是一种轻量级标记语言,它使用简单的语法来创建文本,非常易于学习。它最初被设计为一种用于写作的格式,但现在已经成为了一种非常受欢迎的文本编辑工具。 作为一个较为方便的在线文本编辑器,它可以用代码代替文字&#xf…

一篇完整的测试方案怎么写

看上面的目录,详细 文档说明 文档名称 创建人/修改人 版本 时间 备注 v1.0 2022-11-17 新建 v1.1 2022-11-25 v1.2 2022-12-05 v2.0 2022-12-13 v2.1 2022-12-14 一、文档目的 为软件开发项目管理者、软件工程师、系统维护工程师、测试…

如何开发合成物品功能?

UE5 插件开发指南 前言0 数据结构1 合成面板UI组件2 小结前言 现在策划有一个合成物品的需求:可以将多个低级物品合成高级物品,如果背包中已有低级物品了,合成时需要减掉物品的费用,只需要支付合成费;提供玩家一个合成物品的层级视图,以便于玩家有节奏的购买物品,如下图…

电影《刀剑神域进击篇:暮色黄昏》观后感

上周看了电影《刀剑神域进击篇:暮色黄昏》,刀剑神域系列质量还是非常不错的, 本部电影讲述主角团队攻克boss,阻止公会团体互相打架的故事。 刀剑系列,记得当初是以一部连载动漫为开端,如果不是特别喜欢看动…

计算机网络—HTTP基本概念、HTTPS、HTTP状态码、HTTP缓存、HTTP请求

参考小林coding HTTP基本概念 HTTP是超文本传输协议。所谓的超文本,就是超越了普通文本的文本,最关键的是有超链接,能从一个超文本跳转到另一个超文本。 HTML是最常见的超文本,本身是纯文字文件,但是内部使用很多标签…

Scrum敏捷项目管理实例

这是一个Scrum敏捷单团队敏捷开发示例。 1、建立产品路线图 首先我们需要为这个项目创建一个产品路线图,产品路线图是一个高层次的战略计划,它描述了产品在未来一段时间可能会如何发展和壮大,产品路线图确保整个产品团队持续关注产品的目标…

GEE:对Landsat遥感影像进行处理,水体提取与可视化

作者:CSDN @ _养乐多_ 本文介绍了通过Google Earth Engine平台,并使用Landsat卫星遥感数据提取水体掩膜的方法和代码。通过裁剪和去除云等处理步骤,最终得到具有水体掩膜的影像,并进行可视化和导出。这种方法基于归一化水体指数(MNDWI)和OTSU阈值计算技术,使用了一个自…

MyBatis(MyBatis环境搭建,单表操作)

目录 MyBatis 环境搭建 1.添加 Mybatis 框架支持 2.设置 MyBatis 配置信息 2.1.设置数据库连接的相关信息 2.2 Mybatis xml 保存路径和 xml命名格式 ​编辑 MyBatis 模式开发 Mybatis xml 模板 查询表内容 单元测试 以根据id,查询用户对象这个方法为例 获取动态参数的…

警惕,最近的副业兼职诈骗。

大家好,我是鸟哥。 今天和大家聊聊最近超级猖狂的几类诈骗。 一、副业诈骗。最近两年“副业刚需”这个口号很流行,尤其是今年,职场动荡、工作难找,副业刚需变成了副业焦虑,骗子们也正是抓住了大家的这个心理&#xf…

【Vue全家桶实现电商系统】— VSCode配置Git(二)

【Vue全家桶实现电商系统】— VSCode配置Git(二) 当我们在VScode中编写代码后,需要提交到git仓库时,但是我们又不想切换到git的命令行窗口,我们可以在 VScode中配置git,然后就可以很方便快捷的把代码提交…

JavaScript中的Hook技术:特性、优点、缺点和使用场景

引言: 随着JavaScript的不断发展,开发者们正在寻找更灵活和可扩展的方式来修改或扩展现有的代码。其中一种广泛应用的技术是"Hook",它允许开发者拦截和修改现有的函数或方法的行为。本文将详细介绍JavaScript中的Hook技术&#xf…

软件确认测试、验收测试和系统测试有什么区别和联系?

软件确认测试、验收测试和系统测试都是软件测试过程中的重要环节,它们各自有不同的测试侧重点和目标,但也有一些联系。 1、软件确认测试 称为单元测试或白盒测试,是对软件中各个模块的基本功能进行测试的一种测试方式,主要使用…

【Python从入门到进阶】22、urllib库基本使用

接上篇《21、爬虫相关概念介绍》 上一篇我们介绍了爬虫的相关概念,本篇我们来介绍一下用Python实现爬虫的必备基础,urllib库的学习。 一、Python库的概念 我们今后的学习可能需要用到很多python库(library),及引用其…

在阿里外包干了3个月,我果断跑路了

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

Python接口自动化脚本持续集成过程

之前都是开发人员提交代码到git,触发jenkins拉取git上面的代码并进行编译部署,部署成功后测试人员就可以在浏览器端开始测试了。 作为测试人员,也有跟git和jenkins打交道的时候。 项目实践: python接口自动化脚本编写成功后&am…