python学习4

大家好,这里是七七,今天带来的例子是双对数模型回归代码.总的代码会在文章最后处

本文的风格依旧是面向新手的基础性介绍内容。

目录

库介绍

一、numpy库

二、scipy库

三、sklearn库

代码1

代码2 

 代码3

代码4

代码五

总代码


库介绍

一、numpy库

NumPy是Python中一个用于科学计算的第三方库,它提供了ndarray(N-dimensional array)对象,可以用来表示多维数组。NumPy本身包含了大量基础的数学、统计和线性代数运算函数,例如向量和矩阵运算、随机数生成、傅里叶变换等等。由于NumPy能够进行高效的矩阵计算,因此它成为了很多科学计算库的基础库,例如SciPy、pandas等。

NumPy中最重要的对象是ndarray,它是一个固定类型、多维数组。单个ndarray对象只能存储一种类型的数据,比如整数、浮点数、布尔值等等。NumPy提供了很多运算函数来操作ndarray对象,例如:

  • 创建ndarray对象:可以通过 NumPy 提供的一些函数(例如 np.array()np.zeros()np.ones() 等等)来创建 ndarray 对象;
  • 索引、切片和迭代:ndarray 对象可以和 Python 的内置序列类型一样进行索引、切片和迭代;
  • 形状操作:ndarray 对象可以通过 reshape() 函数改变数组的形状,或者通过 flatten() 函数将多维数组转换为一维数组;
  • 数组拼接和分裂:可以使用 concatenate() 函数将多个数组拼接在一起,或者使用 split() 函数将一个数组分裂为多个子数组;
  • 数组运算:NumPy提供了大量的数学运算函数,例如加减乘除、三角函数、指数函数、对数函数等等;
  • 比较运算:可以使用比较运算符、等价运算符或逻辑运算符来比较数组中的元素,或者使用unique() 函数查找数组中的相同元素;
  • 矩阵计算:NumPy提供了很多用于矩阵计算的函数,例如计算矩阵的转置、求解线性方程组、矩阵的行列式、特征值和特征向量等等。

总之,NumPy 提供了大量的高效计算功能,使得 Python 成为了数据分析、机器学习、科学计算等领域的首选语言。在使用 NumPy 进行科学计算时,需要注意数组对象的维度、数据类型等性质,以便于进行各种操作和计算。

二、scipy库

SciPy(Scientific Python)是一个基于NumPy构建的开源的Python科学计算库。它提供了许多常用的科学计算和数据分析功能,包括数值积分、优化、插值、信号和图像处理、线性代数、统计分布以及一些特殊函数等。SciPy在科学计算、工程、计算机视觉、机器学习等领域得到广泛应用。

SciPy涵盖了许多不同的子模块,每个子模块都关注特定领域的功能和应用。下面是一些常见的SciPy子模块以及它们的主要功能:

- `scipy.optimize`:提供了优化算法的函数,用于最小化或最大化目标函数。
- `scipy.integrate`:提供了数值积分算法的函数,可用于求解单变量或多变量的定积分。
- `scipy.interpolate`:提供了插值函数的工具,用于拟合和重构数据。
- `scipy.signal`:提供了信号处理工具,包括滤波、频谱分析、信号生成等。
- `scipy.linalg`:提供了线性代数函数,用于矩阵运算、求解线性方程组和特征值问题等。
- `scipy.stats`:提供了统计分布和随机变量的函数,用于生成随机样本、计算统计量等。
- `scipy.spatial`:提供了空间数据结构和算法的函数,用于处理空间数据和几何计算。
- `scipy.special`:提供了一些特殊函数,如伽玛函数、贝塞尔函数等。
- `scipy.io`:提供了用于读写各种数据格式的函数,如Matlab文件、NetCDF文件等。
- `scipy.ndimage`:提供了对n维图像数据进行滤波、变换和测量的函数。

除了以上的子模块外,SciPy还提供了许多其他功能,如优化工具包`scipy.optimize`、稀疏矩阵工具包`scipy.sparse`、图像处理工具包`scipy.ndimage`等。这些功能使得SciPy成为一个全面且强大的科学计算库,能够满足各种科学计算和数据分析的需求。

总之,SciPy是一个基于NumPy的Python科学计算库,提供了丰富的函数和工具,用于数值计算、优化、插值、信号处理、线性代数、统计分析以及其他科学计算领域的功能。它与其他Python科学计算库(如NumPy、Matplotlib和pandas)互补,使得Python成为了一种强大的科学计算语言。

三、sklearn库

scikit-learn(简称sklearn)是一个基于Python的机器学习库,提供了丰富的工具和函数,用于数据挖掘和数据分析。它建立在NumPy、SciPy和matplotlib等科学计算库之上,提供了各种机器学习算法和数据预处理技术,使得开发者可以快速、高效地构建和应用各种机器学习模型。

以下是scikit-learn库的主要特点和提供的功能:

1. 一致的API:scikit-learn提供了一致的、基于类的API,使得使用各种不同的机器学习算法变得简单和一致。这使得开发者可以轻松地尝试不同的算法,并对其进行比较和评估。

2. 丰富的机器学习算法:scikit-learn支持包括分类、回归、聚类、降维、模型选择等多种机器学习算法。其中包括最近邻、决策树、支持向量机、线性回归、逻辑回归、聚类算法(如k-means)等。

3. 数据预处理功能:scikit-learn提供了用于数据预处理的工具,包括特征提取、特征缩放、特征选择、数据清洗等。这些工具使得数据准备过程更加简单和高效。

4. 模型评估和选择:scikit-learn提供了评估和选择不同模型的工具,包括交叉验证、网格搜索、模型比较等。这些工具可以帮助开发者选择最佳的模型,并对模型的性能进行评估。

5. 效率和可扩展性:scikit-learn基于优化的C和C++实现,具有高效和可扩展的特点。它支持并行计算,在大规模数据集上能够快速处理。

6. 用于数据可视化的工具:scikit-learn提供了一些工具,用于将数据可视化为图形,帮助开发者更好地理解和分析数据。

总之,scikit-learn是一个功能丰富、易于使用且高效的Python机器学习库。它提供了各种机器学习算法和数据预处理工具,使得开发者可以轻松地构建和应用机器学习模型,并进行数据分析和挖掘。它的文档详尽,拥有广泛的用户社区,为开发者提供了广阔的机器学习领域实践应用和资源。

代码1

from scipy.optimize import minimize

`scipy.optimize.minimize` 是 SciPy 库中的一个函数,用于最小化多元函数的目标值。它提供了多种优化算法,可以用于解决无约束或有约束的最小化问题。

具体来说,`minimize` 函数的使用方法如下:
from scipy.optimize import minimize

result = minimize(fun, x0, method=None, bounds=None, constraints=None)

其中参数的含义如下:

- `fun`:目标函数,即需要最小化的函数。可以是一个 Python 函数或方法。
- `x0`:初始猜测值,即优化变量的初始值。
- `method`:优化算法的选择。可选参数,默认为 `None`,表示使用默认算法(`BFGS`)。
- `bounds`:变量的取值范围。可选参数,默认为 `None`,表示无约束问题。
- `constraints`:约束条件。可选参数,默认为 `None`,表示无约束问题。

`minimize` 函数返回一个 `OptimizeResult` 对象,其中包含了最优解的估计值、目标函数的最小值等信息。

`minimize` 函数提供了多种优化算法,包括无约束优化算法(如 `BFGS`、`Nelder-Mead`、`Powell` 等)、约束优化算法(如 `COBYLA`、`SLSQP` 等)、全局优化算法(如 `differential_evolution`)等。通过指定 `method` 参数,可以选择不同的算法来求解最小化问题。根据具体的问题和约束条件,可以选择合适的算法来获得最佳的结果。

除了 `minimize` 函数,SciPy 的 `optimize` 模块还提供了其他一些用于优化的函数,例如最大化问题的求解函数 `scipy.optimize.maximize`、曲线拟合函数 `scipy.optimize.curve_fit` 等等。

总之,`scipy.optimize.minimize` 函数是 SciPy 库中用于最小化多元函数的优化函数,通过指定目标函数和初始值,可以使用不同的优化算法求解无约束或有约束的最小化问题。

代码2 

from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error

这是在Python中使用sklearn中的metrics模块,导入了如下三个方法:

1. `mean_squared_error(y_true, y_pred)`: 均方误差,是常用的衡量模型预测准确度的指标。它的计算方法为预测值与真实值之差的平方和的均值,公式为:

MSE = 1/n * ∑(y_true_i - y_pred_i)^2,其中n表示样本数量。

2. `r2_score(y_true, y_pred)`: R平方系数,是用来描述两个变量之间的线性关系的强度的常用指标。其取值范围为-∞到1,R²为1表示完美拟合,为0表示预测能力为随机准确率,为负数表示预测结果比随机还糟糕。其计算方法是将总变异分为已解释的变异和未解释的变异两部分,并将已解释的变异占总变异的比例作为模型拟合的好坏程度的指标,公式为:R² = 1 - (SS_res / SS_tot),其中SS_res表示残差平方和,SS_tot表示总平方和。

3. `mean_absolute_error(y_true, y_pred)`: 平均绝对误差,是衡量模型预测准确度的指标之一。其计算方法为预测值和真实值差值的绝对值的平均数,公式为:MAE = 1/n * ∑|y_true_i - y_pred_i|,其中n表示样本数量。

这三个方法都是用于评估机器学习模型的性能表现的指标。在模型训练完毕后,可以使用这些方法对模型的预测结果进行评估,从而调整模型的超参数,提高模型的准确度和泛化能力。

 代码3

y=data.iloc[:,1]
x=data.iloc[:,-7:]
  • y = data.iloc[:, 1]:这行代码将 data DataFrame 的所有行(:)中的第二列(索引1)提取出来,赋值给变量 y。它表示选取 DataFrame 中的一列作为因变量或目标变量。

  • x = data.iloc[:, -7:]:这行代码将 data DataFrame 的所有行(:)中的倒数第七列(索引-7)到最后一列的数据提取出来,赋值给变量 x。它表示选取 DataFrame 中的一部分列作为自变量或特征变量。

`iloc` 是 pandas 中用于按位置(行和列的索引)提取数据的方法,它的作用是通过整数位置进行数据的定位和选择。

`iloc` 的语法为 `dataframe.iloc[row_index, column_index]`,其中 `dataframe` 表示要进行操作的 DataFrame,`row_index` 表示行的索引位置,`column_index` 表示列的索引位置。

`iloc` 的主要特点是使用整数索引进行选取,不像 `loc` 方法那样使用标签进行选取。它接受的索引可以是单个整数、整数列表、整数切片或布尔数组。使用整数索引可以确切地按照位置选取数据,与数据的索引名称无关。

以下是一些常见的用法:

- 单个整数:`dataframe.iloc[3]` 表示选取第4行的数据。
- 整数列表:`dataframe.iloc[[1, 3, 5]]` 表示选取第2、4、6行的数据。
- 整数切片:`dataframe.iloc[2:5]` 表示选取第3到第5行的数据。
- 布尔数组:`dataframe.iloc[boolean_array]` 表示根据布尔数组选取对应位置为 `True` 的行的数据。

类似地,可以在 `column_index` 中使用相同的方式选择列。使用 `iloc` 可以根据行和列的位置灵活地提取数据,非常适用于需要按位置进行数据选择和操作的情况。

代码4

def objective(params,x,y):
    a=params[:-1]
    b=params[-1]
    y_pred=np.dot(x,a)+b
    return np.sum((y_pred-y)**2)

这是一个定义了一个目标函数 objective 的 Python 函数。该函数有三个参数:paramsx,和 y。函数的目标是通过计算数据 x 经过线性变换后的预测值 y_pred,并计算预测值和真实值 y 的平方误差之和。

具体来说,函数的实现如下:

  1. 函数接受一个参数 params,它是一个包含模型权重和偏差的数组。通过将 params 划分为除最后一个元素以外的部分 a 和最后一个元素 b,可以获得模型权重和偏差。

  2. 预测值 y_pred 通过将数据 x 与权重 a 做点积,再加上偏差 b 得到。

  3. 平方误差通过计算预测值 y_pred 与真实值 y 的差的平方,然后求和得到。

最终,函数 objective 返回预测值与真实值的平方误差之和。

代码五

#定义约束条件
constraints=({'type':'eq','fun':lambda params:np.sum(params[:-1]-1)})
#初始参数猜测
initial_guess=np.random.rand(8)
#最小化目标函数
result=minimize(objective,initial_guess,args=(x,y),constraints=constraints)
#获取带约束条件的多元线性回归结果
coefficients=result.x[:-1]
intercept=result.x[-1]
#输出多元线性回归结果
print(f"Cofficients(系数):{coefficients}")
print(f"Intercept(截距):{intercept}")
#使用模型进行预测
y_pred=np.dot(x,coefficients)+intercept
#计算均方误差(MSE)
mse=mean_squared_error(y,y_pred)
#计算R平方(R-squared)
r2=r2_score(y,y_pred)
#计算平均绝对误差(MAE)
mae=mean_squared_error(y,y_pred)
  1. 首先定义了一个约束条件,使用 'type':'eq' 指定了等式类型的约束条件,并使用 lambda 函数将约束条件定义为参数 params 的元素之和与 1 相等。

  2. 定义了用于初始参数猜测的 initial_guess,它是一个包含 8 个随机值的数组。

  3. 使用 minimize 函数最小化目标函数 objective,传入初始参数猜测 initial_guess、数据 (x, y),以及约束条件 constraints

  4. 从最小化结果 result 中获取带约束条件的多元线性回归的系数 coefficients,并获取截距 intercept

  5. 输出多元线性回归的系数和截距。

  6. 使用获得的模型参数进行预测,计算预测值 y_pred

  7. 使用 mean_squared_error 函数计算均方误差(MSE)。

  8. 使用 r2_score 函数计算R平方(R-squared)。

  9. 使用 mean_absolute_error 函数计算平均绝对误差(MAE)。

总代码

import pandas as pd
import numpy as np
from scipy.optimize import minimize
from sklearn.metrics import mean_squared_error,r2_score,mean_absolute_error
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif'] = [u'simHei']
plt.rcParams['axes.unicode_minus'] = False

xlsx_file = 'data/附件1.xlsx'
df_1 = pd.read_excel(xlsx_file)
xlsx_file = 'data/附件2.xlsx'
data = pd.read_excel(xlsx_file)

data['销售日期']=pd.to_datetime(data['销售日期'])

mapping_dict=df_1.set_index('单品编码')['分类名称'].to_dict()
data['品类']=data['单品编码'].map(mapping_dict)

grouped=data.groupby("品类")
sale_num=pd.DataFrame()
price=pd.DataFrame()

for group_name,group_data in grouped:
    print(group_name)
    group_data=group_data[["销售日期","销量(千克)","销售单价(元/千克)"]]
    group_data=group_data.set_index("销售日期")

    if group_name=="水生根茎类":
        sale_num.index=group_data.index
        price.index=group_data.index
        sale_num=sale_num.join(group_data["销量(千克)"].rename(group_name),on="销售日期",how="left")
        price=price.join(group_data["销售单价(元/千克)"].rename(group_name),on="销售日期",how="left")
sale_num.fillna(0)
price.fillna(0)

data=pd.read_excel("./double/oduble_log.xlsx")
data=data.fillna(0)

y=data.iloc[:,1]
x=data.iloc[:,-7:]

#定义多元线性回归的目标函数(最小二乘法)
def objective(params,x,y):
    a=params[:-1]
    b=params[-1]
    y_pred=np.dot(x,a)+b
    return np.sum((y_pred-y)**2)

#定义约束条件
constraints=({'type':'eq','fun':lambda params:np.sum(params[:-1]-1)})
#初始参数猜测
initial_guess=np.random.rand(8)
#最小化目标函数
result=minimize(objective,initial_guess,args=(x,y),constraints=constraints)
#获取带约束条件的多元线性回归结果
coefficients=result.x[:-1]
intercept=result.x[-1]
#输出多元线性回归结果
print(f"Cofficients(系数):{coefficients}")
print(f"Intercept(截距):{intercept}")
#使用模型进行预测
y_pred=np.dot(x,coefficients)+intercept
#计算均方误差(MSE)
mse=mean_squared_error(y,y_pred)
#计算R平方(R-squared)
r2=r2_score(y,y_pred)
#计算平均绝对误差(MAE)
mae=mean_squared_error(y,y_pred)
print(f"均方误差(MSE):{mae}")
print(f"R平方(R-squared):{r2}")
print(f"平均绝对误差(MAE):{mae}")

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七七喝椰奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值