机器学习之线性回归(代码片段)

chenyoude chenyoude     2023-02-19     796

关键词:

目录

预测数值型数据:回归

代码中涉及的数学公式可以自己下载 Typora 这款软件后,把内容复制到.md文件内通过 Typora 打开
本章内容

  • 线性回归
  • 局部加权线性回归
  • 岭回归和逐步线性回归
  • 预测鲍鱼年龄和乐高玩具价格

前面的章节给大家介绍了监督学习的分类部分,接下来几章将会带领同学们翱翔浩瀚的回归海洋,注意此回归不是 Logistic 回归(Logistic 回归之所以取名为这是因为历史遗留问题)。具体是什么,那就开始让我们来揭秘吧!
注意: 分类的目标变量是标称型数据;回归的目标变量是连续性数据。

用线性回归找到最佳拟合直线

  • 线性回归的优缺点:
    ? 优点:结果易于理解,计算上不复杂
    ? 缺点:对非线性的数据拟合不好
    ? 适用数据类型:数值型和标称型数据
  • 回归的目的:预测数值型的目标值
  • 预测汽车功率大小的计算公式:
    功率 = 0.0015 * 耗油量 + 0.99 * 百米加速时长 (纯属虚构,请勿模仿)
  • 回归方程:上述计算公式即回归方程
  • 回归系数:上述计算公式中的0.0015和0.99
  • 预测值:给定所有待输入的特征值乘以对应的回归系数的总和
  • 非线性回归:输出为输入的乘积,例:功率 = 0.0015 * 耗油量 * 百米加速时长
  • 回归的一般方法:
    1. 收集数据:采用任意方法收集数据
    2. 准备数据:回归需要数值型数据,标称型数据将被转成数值型数据
    3. 分析数据:可视化数据,采用缩减法求得新回归系数后绘图再与上一张图比较
    4. 训练算法:找到合适的回归系数
    5. 测试算法:使用 R^2^或者预测值和数据的拟合度,来分析模型的效果
    6. 使用算法:使用回归预测连续性数据的类别标签
  • 矩阵x:输入的所有数据
  • 向量 w:与数据对应的回归系数
  • 预测结果 Y~1~:$Y_1=X^T_1w?$
  • 平方误差:$sum_i=1^m(y_i-x^T_iw)^2$
  • 矩阵表示平方误差:$(y-Xw)^T(y-Xw)$
  • 平方误差对 w 求导:$X^T(Y-Xw)$
  • 平方误差对 w 求导等于零得:$hatw=(X^TX)-1X^Ty$

技术分享图片

  • w 上方的标记含义:当前可以估计出 w 的最优解,即 w 的一个最佳估计
  • 上述公式包含$(X^TX)^-1$,即该方程中的 X 必须存在逆矩阵
    注意:不要纠结于公式,这不会影响你学习机器学习

程序8-1 标准回归函数和数据导入函数

# coding: 'utf-8'
import os
import numpy as np
import matplotlib.pyplot as plt
from path_settings import machine_learning_PATH

data_set_path = os.path.join(machine_learning_PATH, '第八章/data-set')
ex0_path = os.path.join(data_set_path, 'ex0.txt')
ex1_path = os.path.join(data_set_path, 'ex1.txt')
abalone_path = os.path.join(data_set_path, 'abalone.txt')


def load_data_set(filename):
    # 文本第一行值全为0的解释:简单说是因为两个矩阵相乘一个矩阵的行和另一个矩阵的列得相等,具体可查资料
    num_feat = len(open(filename).readline().split('	')) - 1

    data_mat = []
    label_mat = []

    fr = open(filename)
    for line in fr.readlines():
        line_arr = []
        cur_line = line.strip().split('	')
        for i in range(num_feat):
            line_arr.append(float(cur_line[i]))
        data_mat.append(line_arr)
        label_mat.append(float(cur_line[-1]))

    return data_mat, label_mat


def stand_regres(x_arr, y_arr):
    x_mat = np.mat(x_arr)
    y_mat = np.mat(y_arr)
    x_tx = x_mat.T * x_mat

    # 判断矩阵是否为奇异矩阵,即矩阵是否有逆矩阵
    if np.linalg.det(x_tx) == 0:
        print("奇异矩阵没有逆矩阵")
        return

    ws = x_tx.I * (x_mat.T * y_mat.T)

    # 求解未知矩阵
    # ws = np.linalg.solve(x_tx,x_mat.T*y_mat.T)

    return x_mat, y_mat, ws


def test_stand_regres():
    x_arr, y_arr = load_data_set(ex0_path)
    _, _, ws = stand_regres(x_arr, y_arr)
    print(ws)


if __name__ == '__main__':
    test_stand_regres()

程序8-2 基于程序8-1绘图

def plot_stand_regres(x_mat, y_mat, ws):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(x_mat[:, 1].flatten().A[0], y_mat.T[:, 0].flatten().A[0])
    x_copy = x_mat.copy()
    x_copy.sort(0)
    y_hat = x_copy * ws
    ax.plot(x_copy[:, 1], y_hat)
    plt.show()


def test_plot_stand_regres():
    x_arr, y_arr = load_data_set(ex0_path)
    x_mat, y_mat, ws = stand_regres(x_arr, y_arr)
    plot_stand_regres(x_mat, y_mat, ws)

    # 判断拟合效果
    print(np.corrcoef((x_mat * ws).T, y_mat))
    '''
        [[1.         0.98647356]
        [0.98647356 1.        ]]
    '''


if __name__ == '__main__':
    # test_stand_regres()
    test_plot_stand_regres()

图片8-1 ex0的数据集和它的最佳拟合直线

技术分享图片

局部加权线性回归

  • 局部加权线性回归:给待预测点附近的每个点赋予一定的权重
  • 局部加权线性回归求回归系数公式:$hatw=(X^TWX)^-1X^TWy$ 技术分享图片

  • W:给每个数据点赋予权重的矩阵
  • LWLR使用“核”(类似于支持向量机中的核)来对附近的点赋予更高的权重。
  • 最常用的核——高斯核:$w(i,i)=expleft(frac|x^(i)-x|-2k^2 ight)$ 技术分享图片
  • 点 x 与 x(i)越近,w(i,i)将会越大,参数 k 决定了对附近的点赋予多大的权重。

图片8-2 参数k与权重的关系

技术分享图片

  • 假定我们正预测的点是 x=0.5,最上面的是原始数据集,第二个图显示了当 k=0.5 时,大部分数据都用于训练回归模型;最下面的图显示当 k=0.01 时,仅有很少的局部点被用于训练回归模型。

程序8-3 局部加权线性回归函数

def lwlr(test_point, x_arr, y_arr, k=1):
    """给样本点增加权重,参数 k 控制衰减的速度"""
    x_mat = np.mat(x_arr)
    y_mat = np.mat(y_arr)

    m = np.shape(x_mat)[0]

    # 创建对角权重矩阵。该矩阵对角线元素全为1,其余元素全为0
    weights = np.mat(np.eye(m))

    for j in range(m):
        diff_mat = test_point - x_mat[j, :]
        weights[j, j] = np.exp(diff_mat * diff_mat.T / (-2 * k ** 2))

    x_tx = x_mat.T * (weights * x_mat)

    if np.linalg.det(x_tx) == 0:
        print("奇异矩阵没有逆矩阵")
        return

    ws = x_tx.I * (x_mat.T * (weights * y_mat.T))

    return test_point * ws


def lwlr_test(test_arr, x_arr, y_arr, k=1):
    """使数据集中每个点调用 lwlr 方法"""
    m = np.shape(test_arr)[0]

    y_hat = np.zeros(m)

    for i in range(m):
        y_hat[i] = lwlr(test_arr[i], x_arr, y_arr, k)

    return y_hat


def test_lwlr_test():
    x_arr, y_arr = load_data_set(ex0_path)
    y_hat = lwlr_test(x_arr, x_arr, y_arr, 0.003)
    print(y_hat)


def plot_lwlr(x_sort, y_hat, str_ind, x_mat, y_mat):
    fig = plt.figure()
    ax = fig.add_subplot(111)

    ax.plot(x_sort[:, 1], y_hat[str_ind])

    ax.scatter(x_mat[:, 1].flatten().A[0], y_mat.T[:, 0].flatten().A[0], s=2, c='red')

    plt.show()


def test_plot_lwlr():
    x_arr, y_arr = load_data_set(ex0_path)
    x_mat = np.mat(x_arr)
    y_mat = np.mat(y_arr)
    y_hat = lwlr_test(x_arr, x_arr, y_arr, 0.01)
    str_ind = x_mat[:, 1].argsort(0)
    x_sort = x_mat[str_ind][:, 0, :]

    plot_lwlr(x_sort, y_hat, str_ind, x_mat, y_mat)


if __name__ == '__main__':
    # test_stand_regres()
    # test_plot_stand_regres()
    # test_lwlr_test()
    test_plot_lwlr()

图片8-3 局部加权线性回归结果

技术分享图片

示例:预测鲍鱼的年龄

缩减系数来“理解”数据

岭回归

前向逐步回归

权衡偏差与方差

示例:预测乐高玩具套装的价格

收集数据:使用 Google 购物的 API

训练算法:建立模型

本章小结

==尊重原创==
==可以伸出你的小手点个关注,谢谢!==

博客园地址:https://www.cnblogs.com/chenyoude/
github 地址:https://github.com/nickcyd/machine_learning
微信:a1171958281

机器学习之线性回归(代码片段)

以kaggle上的HousePrices:AdvancedRegressionTechniques为例讲述线性回归fromsklearn.linear_modelimportLinearRegression,RidgeCV,LassoCV,ElasticNetCV1、回归模型(1)一般线性回归:LinearRegressionwithoutregularizationfromsklearn.linear_modelimportLinearRegressionlr=LinearRegression... 查看详情

菜鸟之路——机器学习之非线性回归个人理解及python实现(代码片段)

关键词:梯度下降:就是让数据顺着梯度最大的方向,也就是函数导数最大的放下下降,使其快速的接近结果。Cost函数等公式太长,不在这打了。网上多得是。这个非线性回归说白了就是缩小版的神经网络。python实现:1importnump... 查看详情

机器学习之线性回归(代码片段)

目录预测数值型数据:回归用线性回归找到最佳拟合直线程序8-1标准回归函数和数据导入函数程序8-2基于程序8-1绘图图片8-1ex0的数据集和它的最佳拟合直线局部加权线性回归图片8-2参数k与权重的关系程序8-3局部加权线性回归函... 查看详情

机器学习之线性回归岭回归lasso回归(代码片段)

1、回归算法分类算法的目标值是标称型数据,而回归的目标变量是连续型数据,主要包括线性回归,岭回归,lasso回归,前向逐步回归。2、线性回归线性回归主要用于处理线性数据,结果易于理解,计算复杂度不高,但是处理... 查看详情

机器学习之回归篇(代码片段)

机器学习之回归篇(一)一、综述?回归就是从一组数据出发,确定某些变量之间的定量关系式,也就是建立数学模型并估计未知参数。回归的目的是预测数值型的目标值,它的目标是接受连续数据,寻找最适合数据的方程,并... 查看详情

机器学习之线性回归

1.线性回归简述在统计学中,线性回归(LinearRegression)是利用称为线性回归方程的最小平方函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析。这种函数是一个或多个称为回归系数的模型参数的线性组合(自变... 查看详情

机器学习之回归模型-调用sklearn库求解线性回归(代码片段)

机器学习之回归模型-调用sklearn库求解线性回归在使用sklearn库之前,我们先看一下这个库的结构,该库经常用于监督学习和无监督学习,sklearn共分为6大部分,分别用于完成分类任务,回归任务,聚类任务&... 查看详情

机器学习之回归模型-梯度下降法求解线性回归(代码片段)

机器学习之回归模型-梯度下降法求解线性回归线性回归是一种线性模型,它假设输入变量x与单个输出变量y之间存在线性关系。具体的说,就是利用线性回归模型,从一组输入变量的线性组合中,计算出输出变量y... 查看详情

机器学习之线性回归以及logistic回归

1、线性回归回归的目的是预测数值型数据的目标值。目标值的计算是通过一个线性方程得到的,这个方程称为回归方程,各未知量(特征)前的系数为回归系数,求这些系数的过程就是回归。对于普通线性回归使用的损失函数... 查看详情

机器学习之一元线性回归模型

一元线性回归模型样本数量m           输入变量x              输出变量y    &nb 查看详情

机器学习之回归模型-一元线性回归理论与最小二乘法实现(代码片段)

机器学习之回归模型-一元线性回归理论与最小二乘法实现线性回归是一种线性模型,它假设输入变量x与单个输出变量y之间存在线性关系。具体的说,就是利用线性回归模型,从一组输入变量的线性组合中,计算... 查看详情

机器学习之线性回归---logistic回归---softmax回归

1摘要     本报告是在学习斯坦福大学机器学习课程前四节加上配套的讲义后的总结与认识。前四节主要讲述了回归问题,回归属于有监督学习中的一种方法。该方法的核心思想是从连续型统计数据中得到数学... 查看详情

javascript机器学习之线性回归

译者按:AI时代,不会机器学习的JavaScript开发者不是好的前端工程师。原文:MachineLearningwithJavaScript:Part1译者:Fundebug为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。使用JavaScript做机器学... 查看详情

机器学习之线性回归

1.机器学习算法**监督学习:**已经知道类别的样本,通过一定的模型或者是特定的算法,可以预测出某种特定的结果,例如预测房价,最终可以预测出房价是什么,或者是预测肿瘤疾病,判断肿瘤是良... 查看详情

机器学习之线性回归

1.机器学习算法**监督学习:**已经知道类别的样本,通过一定的模型或者是特定的算法,可以预测出某种特定的结果,例如预测房价,最终可以预测出房价是什么,或者是预测肿瘤疾病,判断肿瘤是良... 查看详情

深度学习之线性回归+基础优化(代码片段)

线性回归可以看作一个最简单的神经网络模型损失函数在我们开始考虑如何用模型拟合(fit)数据之前,我们需要确定一个拟合程度的度量。损失函数(lossfunction)能够量化目标的实际值与预测值之间的差距... 查看详情

机器学习之线性回归概念总结速记

目录线性回归简介线性回归应用场景线性回归定义线性回归模型线性回归初步使用步骤分析代码过程线性回归的损失和优化损失函数优化算法正规方程梯度下降梯度的概念梯度下降和正规方程的对比算法选择依据欠拟合和过拟合... 查看详情

20171028机器学习之线性回归过拟合问题的解决方案

在函数中加入一个正则项: 三种方式:一、Ridge回归(岭回归):  优点:具有较高的准确性、鲁棒性以及稳定性  缺点:求解速度慢二、Lasso回归:  优点:求解速度快(原理降维计算,把数据维度中存在的噪音和... 查看详情