线性回归算法实现

这篇具有很好参考价值的文章主要介绍了线性回归算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

回归算法是一种有监督算法。
回归算法是一种比较常用的机器学习算法,用来建立“解释”变量(自变量X)和观 测值(因变量Y)之间的关系;从机器学习的角度来讲,用于构建一个算法模型(函 数)来做属性(X)与标签(Y)之间的映射关系,在算法的学习过程中,试图寻找一个 函数使得参数之间的关系拟合性最好。 回归算法中算法(函数)的最终结果是一个连续的数据值,输入值(属性值)是一个d 维度的属性/数值向量。

本文主要用于线性回归代码的实现,相关理论知识请参考博主的另一篇文章:机器学习(三)线性回归原理

一、目录结构

线性回归算法实现

二、数据预处理

import numpy as np

from utils.features.generate_sinusoids import generate_sinusoids


def prepare(data, polynomial_degree=0, sinusoid_degree=0, normalize_data=True):
    num_examples = data.shape[0]
    data_processed = np.copy(data)    
    features_mean = 0    
    features_deviation = 0    
    data_normalized = data_processed
    if normalize_data:
        (            
            data_normalized,
            features_mean,           
            features_deviation
        ) = normalize(data_processed)
      
    data_processed = data_normalized
    # 特征变换
    if sinusoid_degree > 0:
        sinusoids = generate_sinusoids(data_normalized, sinusoid_degree)        
        data_processed = np.concatenate((data_processed, sinusoids), axis=1)    
    # # 特征变换    
    # if polynomial_degree > 0:    
    #     polynomials = generate_polynomials(data_normalized, polynomial_degree, normalize_data)    
    #     data_processed = np.concatenate((data_processed, polynomials), axis=1)    
    data_processed = np.hstack((np.ones((num_examples, 1)), data_processed))    
    return data_processed, features_mean, features_deviation


def normalize(features):
    features_normalized = np.copy(features).astype(float)    
    # 计算均值    
    features_mean = np.mean(features, 0)    
    # 计算标准差    
    features_deviation = np.std(features, 0)    
    # 标准化操作    
    if features.shape[0] > 1:
        features_normalized -= features_mean

    # 防止除0    
    features_deviation[features_deviation == 0] = 1    
    features_normalized /= features_deviation

    return features_normalized, features_mean, features_deviation

三、generate_sinusoids函数的定义

import numpy as np


def generate_sinusoids(dataset, sinusoid_degree):
    num_examples = dataset.shape[0]    
    sinusoids = np.empty((num_examples, 0))    
    for degree in range(1, sinusoid_degree + 1):
        sinusoid_features = np.sin(degree * dataset)        
        sinusoids = np.concatenate((sinusoids, sinusoid_features), axis=1)    
    return sinusoids

四、线性回归

import numpy as np
from utils.features import pre_for_training


class LinearRegression:
    def __init__(self,
                     data,                 
                     labels,                 
                     polynomial_degree=0,                 
                     sinusoid_degree=0,                
                      normalize_data=True):
        """        
        对数据预处理,获取所有特征个数,初始化参数矩阵        
        :param data: 训练特征集        
        :param labels: 训练目标值        
        :param polynomial_degree: 特征变换        
        :param sinusoid_degree: 特征变换        
        :param normalize_data: 标准化数据处理        
        """        
        (data_processed, features_mean, features_deviation) = \
            pre_for_training.prepare(data=data, polynomial_degree=polynomial_degree, 
                                      sinusoid_degree=sinusoid_degree, normalize_data=normalize_data)
        self.data = data_processed                              
        self.labels = labels
        self.features_mean = features_mean
        self.features_deviation = features_deviation
        self.polynomial_degree = polynomial_degree
        self.sinusoid_degree = sinusoid_degree
        self.normalize_data = normalize_data
        num_features = self.data.shape[1]        
        self.theta = np.zeros((num_features, 1))    
        
        def train(self, alpha, num_iterations=500):
            """        
            执行梯度下降        
            :param alpha: 学习绿        
            :param num_iterations: 学习次数        
            :return: 特征参数,历史损失值        
            """        
            loss_history = self.gradient_descent(alpha=alpha, num_iterations=num_iterations)        
        return self.theta, loss_history

    def gradient_descent(self, alpha, num_iterations):
        """        
        迭代下降参数        
        :param alpha: 学习率        
        :param num_iterations: 训练次数        
        :return: 历史损失列表        
        """        
        loss_history = list()        
        for _ in range(num_iterations):
            self.gradient_step(alpha)            
            loss_history.append(self.loss_function(self.data, self.labels))        
        return loss_history

    def gradient_step(self, alpha):
        """        
        梯度下降,参数更新        
        :param alpha: 学习率        
        :return: 拟合参数       
         """        
        num_examples = self.data.shape[0]        
        predictions = LinearRegression.hypothesis(self.data, self.theta)        
        delta = predictions - self.labels
        theta = self.theta
        theta = theta - alpha * (1 / num_examples) * (np.dot(delta.T, self.data)).T
        self.theta = theta

    def loss_function(self, data, labels):
        """        
        计算损失        
        :param data: 特征参数        
        :param labels: 特目标值        
        :return:  损失结果        
        """        
        num_examples = data.shape[0]        
        delta = LinearRegression.hypothesis(data=self.data, theta=self.theta) - labels
        loss = (1 / 2) * np.dot(delta.T, delta)/num_examples
        # print(loss, loss.shape)        
        return loss[0][0]    
        
    @staticmethod    
    def hypothesis(data, theta):
            predictions = np.dot(data, theta)        
            return predictions


    def get_loss(self, data, labels):
        data_processed = pre_for_training.prepare(data=data, 
                                                  polynomial_degree=self.polynomial_degree, 
                                                  sinusoid_degree=self.sinusoid_degree,  
                                                  normalize_data=self.normalize_data)[0] 
                                                  
        return self.loss_function(data=data_processed, labels=labels)
        
        
    def predict(self, data):
        """        
        预测        
        :param data: 参数        
        :return: 预测结果        
        """        
        data_processed = pre_for_training.prepare(data=data, polynomial_degree=self.polynomial_degree, 
                                                 sinusoid_degree=self.sinusoid_degree,  
                                                 normalize_data=self.normalize_data)[0] 
        predictions = LinearRegression.hypothesis(data=data_processed, theta=self.theta)      
        return predictions

五、单参数预测

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

from linearRegression import linear_regression
from utils.features import pre_for_training

data = pd.read_csv("../data/wind_dataset.csv")

for i in data.columns:
    if not np.all(pd.notnull(data[i])):
        data[i].fillna(data[i].mean())
train_data = data.sample(frac=0.8)
test_data = data.drop(train_data.index)

input_param_name = "RAIN"
output_param_name = "WIND"

x_train = train_data[[input_param_name]].values
y_train = train_data[[output_param_name]].values

x_test = test_data[[input_param_name]].values
y_test = test_data[[output_param_name]].values

num_iterations = 500
learning_rate = 0.01

linearRegression = linear_regression.LinearRegression(x_train, y_train)
(theta, loss_history) = linearRegression.train(alpha=learning_rate, num_iterations=num_iterations)

print("开始时损失值:", loss_history[0])
print("结束时损失值:", loss_history[-1])

plt.plot(range(num_iterations), loss_history)
plt.xlabel("Iter")
plt.ylabel("Loss")
plt.title("Gradient")
plt.show()

predictions_num = 100
x_predictions = np.linspace(x_train.min(), x_train.max(), predictions_num).reshape((predictions_num, 1))
y_predictions = linearRegression.predict(x_predictions)


plt.scatter(x_train, y_train, label="Train data")
plt.scatter(x_test, y_test, label="Test data")
plt.plot(x_predictions, y_predictions, "r", label="Prediction")
plt.xlabel(input_param_name)
plt.ylabel(output_param_name)
plt.title("Wind Prediction")
plt.legend()
plt.show()

六、结果

线性回归算法实现

线性回归算法实现

线性回归算法实现文章来源地址https://www.toymoban.com/news/detail-504924.html

到了这里,关于线性回归算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习与深度学习——使用paddle实现随机梯度下降算法SGD对波士顿房价数据进行线性回归和预测

    随机梯度下降(SGD)也称为增量梯度下降,是一种迭代方法,用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。SGD在高度非凸的损失表面上远远超越了朴素梯度下降法,这种简单的爬山法技术已经主导了现代的非凸优化。

    2024年02月03日
    浏览(54)
  • 机器学习~从入门到精通(二)线性回归算法和多元线性回归

    SimpleLinearRegression.py moduel_selection.py draft.py lin_fit(x,y) lin_fit2(x,y) x.shape y.shape MSE mean squared error 均方误差 R squared error

    2024年02月01日
    浏览(68)
  • 05- 线性回归算法 (LinearRegression) (算法)

    线性回归算法(LinearRegression) 就是假定一个数据集合预测值与实际值 存在一定的误差 , 然后假定所有的这些误差值 符合正太分布 , 通过方程 求这个正太分布的最小均值和方差 来还原原数据集合的斜率和截距。 当误差值无限接近于0时, 预测值与实际值一致, 就变成了 求误差的

    2024年02月15日
    浏览(36)
  • 多元线性回归算法(matlab)

    b:回归系数点估计 bint:回归系数区间估计 r:残差 rint:置信区间 stats:用于检验的统计量,有三个数值,相关系数r^2,F值,与F对应的概率p alpha:显著性水平(缺省时为0.05) 说明:相关系数r^2越接近1,说明回归方程越显著; F越大,说明回归方程越显著 与F对应的概率pa(显著性水

    2024年02月07日
    浏览(42)
  • sklearn应用线性回归算法

    目录 实现线性回归算法 1) 准备数据 2) 实现算法 线性回归步骤 sklearn实现朴素贝叶斯 1) 算法使用流程 2) 朴素贝叶斯算法应用 Scikit-learn 简称  sklearn  是基于 Python 语言实现的机器学习算法库,它包含了常用的机器学习算法,比如回归、分类、聚类、支持向量机、随机森林等等

    2024年02月12日
    浏览(42)
  • 多元线性回归算法(SPSS)

    接上篇 (1条消息) 多元线性回归算法(matlab)_成、谋的博客-CSDN博客 本篇博客主要参考自文章: (1条消息) 数学建模暑期集训6:用SPSS对数据进行多元线性回归分析_zstar-_的博客-CSDN博客_多元线性回归分析spss 三个变量:树干直径、树干高度、树干体积, 树干体积和树干直径、

    2023年04月20日
    浏览(45)
  • 机器学习——多元线性回归算法

    多元线性回归算法,即多特征量线性回归算法,用多个特征量来进行预测,如这里用多个特征量(房子面积、卧室数量、房屋楼层数、房子年龄)来预测房子的售价问题 假如有一个多特征量的机器学习问题,并且这个问题中的多个特征可以在一个相近的范围内取值,那么可以

    2024年02月22日
    浏览(45)
  • 【机器学习】十大算法之一 “线性回归”

      作者主页: 爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主 爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域. https://blog.csdn.net/Code_and516?type=blog 个人简介:打工人。 持续分

    2024年02月09日
    浏览(36)
  • 机器学习算法:线性回归、逻辑回归、决策树和随机森林解析

    引言 机器学习算法是人工智能领域的核心,它们用于解决各种问题,从预测房价到图像分类。本博客将深入探讨四种常见的机器学习算法:线性回归、逻辑回归、决策树和随机森林。 线性回归 什么是线性回归? 线性回归是一种用于建立连续数值输出的机器学习模型的算法。

    2024年02月10日
    浏览(49)
  • [Python中常用的回归模型算法大全:从线性回归到XGBoost]

    在数据科学和机器学习领域,回归分析是一项关键任务,用于预测连续型变量的数值。除了传统的线性回归模型外,Python提供了丰富多样的回归模型算法,适用于各种复杂的数据关系。本文将深入探讨这些回归模型,并介绍一系列常用的非线性回归方法。我们将涵盖多种模型

    2024年02月07日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包