线性回归算法实现

news2024/11/16 12:06:11

回归算法是一种有监督算法。
回归算法是一种比较常用的机器学习算法,用来建立“解释”变量(自变量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()

六、结果

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

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

相关文章

Search space set group switching(二)

R17规定UE可以根据DCI 0_2/0_1/1_1/1_2 的PDCCH monitoring adaptation field 结合具体的配置,对Type3-PDCCH CSS sets 或 USS sets 的acitve DL BWP进行skipping PDCCH monitoring或search space set group switch(包括2个SSSG或3个SSSG的switching)的操作。3个SSS…

腾讯云轻量应用服务器便宜是不是性能差?

腾讯云轻量应用服务器便宜?大揭秘!为什么便宜?因为限制月流量,虽然公网带宽看似很大,有月流量限制,但是也不得不说,轻量应用服务器性价比确实高,大家估算下自身应用,如果…

打包apk时出现Execution failed for task ‘:app:lintVitalRelease

程序可以正常运行,但是打包apk的时候报Execution failed for task ‘:app:lintVitalRelease导致打包失败,原因是执行lintVitalRelease失败了,存在错误。解决办法:在app模块的build.gradle的Android里面添加如下代码: l…

如何在linux上查看显卡型号

使用命令lspci | grep VGA 在我的主机上得到如下信息: 08:00.0 VGA compatible controller: NVIDIA Corporation Device 2504 (rev a1)发现我的显卡型号是2504,这和我们印象中的显卡型号如1080Ti之类的不一样,看起来不像真正的型号。我们需在pci这个网…

火爆全网,Python自动化测试-openpyxl操作测试(详细)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 当做自动化测试时…

{“errMsg“:“setTabBarBadge:fail not TabBar page“}

问题描述:想要在详情页添加商品到购物车后,同时更新tabBar页面的购物袋徽标。于是直接在goods-detail页面使用以下代码后,发现报错: uni.setTabBarBadge({index: 3,text: this.goodsCount}) 错误信息:{"errMsg&q…

python爬虫-逆向实例小记-3

注意!!!!某数据网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!!! 案例分析 第一步:分析页面。查看响应内容,内容加密 第二步&am…

案例研究|小牛电动通过DataEase进行业务数据可视化分析

小牛电动(Niu Technologies)创立于2014年,是全球智能城市出行解决方案提供商。小牛电动的产品线包括电动自行车、电动摩托车、电动滑板车等。小牛电动在销售渠道上采用了线上线下相结合的模式,通过线上电商平台和线下门店销售&…

HP惠普暗影精灵6 OMEN笔记本电脑-15-en0007ax原厂Win10系统镜像,原装OEM系统,恢复出厂状态

HP惠普暗影精灵6笔记本电脑,OMEN 笔记本电脑-15-en0007ax原装出厂Win10系统,恢复原厂系统 15-en0005ax 、15-en0006ax 、15-en0007ax、 15-en0030ax、 15-en0031ax、 15-en0032ax 、15-en0033ax、 15-en0034ax、 15-en0035ax、 15-en0043ax 系统自带所…

树形控件父节点不选中,只能选中子节点,如何实现?

rTree 树形控件一级菜单没有复选框,子菜单有复选框,如何实现?_阿 尭的博客-CSDN博客 接上一篇博客,继续深入功能,如何只选中叶子节点而不选中父节点。 1.在节点被点击时的回调,node-click中,返…

Layui时间范围选择器,添加快捷键【本周、本月、本季度、本年】

界面 <input id"Date_select" type"text" class"form-control" placeholder"请选择时间范围" style"border-radius: 4px;" /><input id"StartDate" type"hidden" /><input id"EndD…

Qt动态多级导航菜单(三)

前文链接&#xff1a;Qt动态多级导航菜单&#xff08;二&#xff09; 本次更新&#xff0c;主要将原导航项NavItem抽象为基类NavItemBase, 并派生出带有图标样式的动态多级导航菜单。至此&#xff0c;关于想要增加自定义的导航菜单样式&#xff0c;只需要从NavItemBase类派生即…

【Windows系统优化篇】谨慎开启“来自微软输入法的启用建议“功能

【Windows系统优化篇】谨慎开启"来自微软输入法的启用建议"功能 出于个人隐私数据的保护&#xff0c;不建议开启这玩意&#xff0c;容易造成个人隐私数据泄露。—【蘇小沐】 1.实验环境 系统版本Windows 11 专业工作站版22H2&#xff08;22621.1928&#xff09;&a…

为什么扩散模型能如此迅速地取代 GAN?看完这篇文章你就懂了

在人工智能领域&#xff0c;文本生成和图像生成一直是备受关注的领域。GAN (Generative Adversarial Networks) 技术作为当前最流行的生成模型之一&#xff0c;在这个领域内占据了重要地位。但是&#xff0c;随着技术的不断发展和应用&#xff0c;它的局限性也逐渐显露出来。而…

【Window doc命令与批处理文件】

Window doc命令与批处理文件 doc命令 快速生成一个内容为空(里面是空格)&#xff0c;大小不为空的文件 fsutil file createnew d:\workspace\haha.ini 1024window doc修改关联命令 assoc .txtexecfile assoc .txttxtfilewindow 关机命令 shutdown -s -t 100 # 100s后关机…

你以为很炸裂的建筑和真正炸裂的建筑

你以为很炸裂的那个建筑&#xff0c;可能是最近刷爆朋友圈&#xff0c;惊呆所有人的小教堂吧&#xff1a;“Reading between the lines”&#xff0c;一座由比利时年轻建筑师组合Gijs Van Vaerenbergh于2011年设计的大型公共艺术装置。很多人觉得这是全世界在视觉上最独特的“透…

【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片

个人主页&#xff1a;为梦而生~ 关注我一起学习吧&#xff01; 专栏&#xff1a;python网络爬虫从基础到实战 欢迎订阅&#xff01;后面的内容会越来越有意思~ 往期推荐&#xff1a; 【Python爬虫开发基础⑦】urllib库的基本使用 【Python爬虫开发基础⑧】XPath库及其基本用法 …

Windows环境下设置redis开启自动启动

一、首先下载好Redis 二、设置Redis服务 由于上面虽然启动了redis&#xff0c;但是只要一关闭cmd窗口&#xff0c;redis就会消失。所以要把redis设置成windows下的服务。 打开电脑的服务列表发现并没有所谓的Redis的服务。 我们需要进入到你安装的Redis的目录中&#xff0c;通…

系列五、NotePad++下载安装

一、下载 链接&#xff1a;https://pan.baidu.com/s/1U2f74vfBJIds7W2wJYnBxg?pwdyyds 提取码&#xff1a;yyds 二、安装 2.1、安装NotePad 解压NotePad-x64.zip至指定目录即可&#xff0c;例如 2.2、安装NppFTP 2.2.1、查看NotePad对应的位数&#xff08;32位or64位&a…

8.pixi.js编写的塔防游戏(类似保卫萝卜)-发射圆圈子弹技能

游戏说明 一个用pixi.js编写的h5塔防游戏&#xff0c;可以用electron打包为exe&#xff0c;支持移动端&#xff0c;也可以用webview控件打包为app在移动端使用 环境说明 cnpm6.2.0 npm6.14.13 node12.22.7 npminstall3.28.0 yarn1.22.10 npm config list electron_mirr…