Python机器学习(二):线性回归算法

简介: 机器学习研究的问题分为分类问题和回归问题。分类问题很好理解,而回归问题就是找到一条曲线,可以最大程度地拟合样本特征和样本输出标记之间的关系。当给算法一个输入时,这条曲线可以计算出相应可能的输出。

机器学习研究的问题分为分类问题回归问题。分类问题很好理解,而回归问题就是找到一条曲线,可以最大程度地拟合样本特征和样本输出标记之间的关系。当给算法一个输入时,这条曲线可以计算出相应可能的输出。回归算法最简单的就是线性回归。当样本特征只有一个时,称为简单线性回归;当样本特征有多个时,称为多元线性回归

img_09c23661093aebe566d5eb47705df8d4.png
线性回归

1.简单线性回归

由上图可知,简单线性回归只有一个特征x,一个标记y。假定x和y之间具有类似于线性的关系,就可以使用使用简单线性回归算法。假定我们找到了最佳拟合的直线方程

img_ea32a3521da780f2f384daf605473be5.png
最佳拟合的直线方程

则对于每一个样本点x(i),预测值如下。其中带箭头的y是预测值,称为 y head。右上角的 i 是指样本的索引。
img_e043034d0d842d41ec8e4075db66931d.png
预测值

我们希望预测值和真实值之间的差距尽量小。一般用欧氏距离来衡量。下式称为 损失函数(Loss Function)
img_2e8e0edfd16577ee12a048e4e5171252.png
损失函数

换句话说,我们的目标就是找到一组a和b,使得下式最小
img_e95b555f81a9a6b93a5f676a916aaa98.png
y(i)和x(i)是固定的

通过分析不同的问题,我们需要确定问题的损失函数。通过最优化损失函数,获得机器学习的模型。几乎所有的参数学习算法都是这样的套路

那么这个问题是一个典型的最小二乘法问题,即最小化误差的平方。推导可得以下公式


img_25d1aea6c77680e4460c98bfe599f664.png
最小二乘法

可以用python封装成这种形式

"""
Created by 杨帮杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 华南农业大学
"""

import numpy as np

class SimpleLinearRegression:

    def __init__(self):
        """初始化Simple Linear Regression 模型"""
        self.a_ = None
        self.b_ = None

    def fit(self, x_train, y_train):
        """根据训练数据集x_train,y_train训练Simple Linear Regression 模型"""
        assert x_train.nidm == 1, \
            "Simple Linear Regressor can only solve single feature training data."
        assert len(x_train) == len(y_train), \
            "the size of x_train must be equal to the size of y_train"

        x_mean = np.mean(x_train)
        y_mean = np.mean(y_train)

        """进行向量化可以加快训练速度"""
        # num = 0.0
        # d = 0.0
        # for x, y in zip(x_train, y_train):
        #     num += (x - x_mean) * (y - y_mean)
        #     d += (x - x_mean) ** 2

        num = (x_train - x_mean).dot(y_train - y_mean)
        d = (x_train - x_mean).dot(x_train - x_mean)

        self.a_ = num/d
        self.b_ = y_mean - self.a_ * x_mean

        return self

    def predict(self, x_predict):
        """给定待预测数据集x_predict, 返回表示x_predict的结果向量"""
        assert x_predict.ndim == 1, \
            "Simeple Linear Regressor can only solve single feature training data."
        assert self.a_ is not None and self.b_ is not None, \
            "must fit before predict!"

        return np.array([self._predict(x) for x in x_predict])

    def _predict(self, x_single):
        """给定单个待预测数据x_single, 返回x_single的预测结果值"""
        return self.a_ * x_single + self.b_

    def __repr__(self):
        return "SimpleLinearRegression()"

衡量线性回归模型好坏有多个标准,均方误差(Mean Squared Error)、均方根误差(Root Mean Squared Error)、平均绝对误差(Mean Absolute Error)等。一般使用MSE。


img_a7b0d4f92723348421b4e40497f85ac8.png
均方误差MSE
img_10eae95b8954fdd08825e96ef06bcbee.png
均方根误差RMSE

img_5841879e1219ceeca0f1c30d8045f3ce.png
平均绝对误差MAE

而如果想像分类问题一样将评判得分限制在0和1之间,则应该使用R Square

img_7cb8a42ca0d772b3549d7ed266d7381c.png
R Square

右边一项的分子代表使用模型产生的错误,分母代表使用平均值进行预测产生的错误。分母也可以理解为一个模型,称为 Baseline Model

R Square的输出分为以下几种情况:

  • R^2 = 1,则模型不犯任何错误,完美
  • R^2 = 0,模型为基准模型,相当于没训练过
  • R^2 < 0,数据可能不存在任何线性关系

2.多元线性回归

多元线性回归,就是指样本特征值有多个。根据这多个特征值来预测样本的标记值。那么特征X和参数Θ就是一个向量。

img_2f78c1093556260e3032fbf287060e46.png
多元线性回归

相类似地,我们需要找到一个损失函数。我们需要找到一组参数Θ,使下式尽可能小


img_8f70459b6b81f09d5edbc6d2fd22488c.png
损失函数

img_5295623fe026b18cb28c8ae6d0910148.png
预测值有n个参数

为了方便进行矩阵运算,我们写成这种形式


img_6a8d455e9d2f81eec6c2546375a1cc9d.png
X0不是特征输入!

预测值可以写成这种形式


img_7978f9c054ce549034a6348ca1fc40b2.png
预测值和参数是n维向量,X是n维矩阵

X展开是这个样子。每一行是一个样本点,每一列(除了第一列)是一种特征
img_726925cd9e768cec00c83e3b4307cf7d.png
展开

经过推导,得到这样一个公式。这成为多元线性回归的正规方程解(Normal Equation)。结果就是参数向量。

img_dd546671996d6e29cfc4255510cf4eb1.png
我也不知道怎么来的

img_527459709419fdb5637bb1e87da89394.png
Θ0就是简单线性回归中的b

如上,可以封装成这种形式

"""
Created by 杨帮杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 华南农业大学
"""

import numpy as np

class LinearRegression:

    def __init__(self):
        """初始化Linear Regression模型"""
        self.coef_ = None
        self.interception_ = None
        self._theta = None

    def fit_normal(self, X_train, y_train):
        """根据训练数据集X_train, y_train训练Linear Regression模型"""
        assert X_train.shape[0] == y_train.shape[0], \
            "the size of X_train must be equal to the size of y_train"

        X_b = np.hstack([np.ones((len(X_train), 1)), X_train])
        self._theta = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y_train)

        self.interception_ = self._theta[0]
        self.coef_ = self._theta[1:]

        return self

    def predict(self, X_predict):
        """给定待预测数据集X_predict, 返回表示X_predict的结果向量"""
        assert self.interception_ is not None and self.coef_ is not None, \
            "must fit before predict!"
        assert X_predict.shape[1] == len(self.coef_), \
            "the feature number of X_predict must be equal to X_train"

        X_b = np.hstack([np.ones((len(X_predict), 1)), X_predict])

        return X_b.dot(self._theta)

    def __repr__(self):
        return "LinearRegression()"

sciki-learn中使用线性回归如下

"""
Created by 杨帮杰 on 10/1/18
Right to use this code in any way you want without
warranty, support or any guarantee of it working
E-mail: yangbangjie1998@qq.com
Association: SCAU 华南农业大学
"""

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 加载波士顿房价的数据集
boston = datasets.load_boston()

# 清除一些不合理的数据
X = boston.data
y = boston.target

X = X[y < 50.0]
y = y[y < 50.0]

# 分离出测试集并拟合
X_train, X_test, y_train, y_test = train_test_split(X, y)

lin_reg = LinearRegression()

lin_reg.fit(X_train, y_train)

# 打印结果
print(lin_reg.coef_)
print(lin_reg.intercept_)
print(lin_reg.score(X_test, y_test))

输出如下

img_479057ecfa5ede8287bcf0591264d891.png
打印结果

3.总结

线性回归是许多其他回归和分类问题的基础。

它最大的优点是对数据具有很强的解释性。比如某一项的参数是正数,那么很可能这个特征和样本标记之间成正相关,反之成负相关。

优点:

  1. 思想简单,实现容易
  2. 是许多非线性模型的基础
  3. 具有很好的可解释性

缺点:

  1. 假设特征和标记之间有线性关系,现实中不一定
  2. 训练的时间复杂度比较高

References:
Python3 入门机器学习 经典算法与应用 —— liuyubobobo
机器学习实战 —— Peter Harrington

目录
相关文章
|
1天前
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
30 21
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
|
1天前
|
机器学习/深度学习 人工智能 算法
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
鸟类识别系统。本系统采用Python作为主要开发语言,通过使用加利福利亚大学开源的200种鸟类图像作为数据集。使用TensorFlow搭建ResNet50卷积神经网络算法模型,然后进行模型的迭代训练,得到一个识别精度较高的模型,然后在保存为本地的H5格式文件。在使用Django开发Web网页端操作界面,实现用户上传一张鸟类图像,识别其名称。
30 11
鸟类识别系统Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+ResNet50算法模型+图像识别
|
2天前
|
机器学习/深度学习 算法 TensorFlow
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
动物识别系统。本项目以Python作为主要编程语言,并基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集4种常见的动物图像数据集(猫、狗、鸡、马)然后进行模型训练,得到一个识别精度较高的模型文件,然后保存为本地格式的H5格式文件。再基于Django开发Web网页端操作界面,实现用户上传一张动物图片,识别其名称。
17 1
动物识别系统Python+卷积神经网络算法+TensorFlow+人工智能+图像识别+计算机毕业设计项目
|
21小时前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
22 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
9天前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
24 9
|
2天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
10天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
27 5
|
15天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
15天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
16天前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。