大家好,这里是七七,今天带来的例子是双对数模型回归代码.总的代码会在文章最后处
本文的风格依旧是面向新手的基础性介绍内容。
目录
NumPy是Python中一个用于科学计算的第三方库,它提供了ndarray(N-dimensional array)对象,可以用来表示多维数组。NumPy本身包含了大量基础的数学、统计和线性代数运算函数,例如向量和矩阵运算、随机数生成、傅里叶变换等等。由于NumPy能够进行高效的矩阵计算,因此它成为了很多科学计算库的基础库,例如SciPy、pandas等。
NumPy中最重要的对象是ndarray,它是一个固定类型、多维数组。单个ndarray对象只能存储一种类型的数据,比如整数、浮点数、布尔值等等。NumPy提供了很多运算函数来操作ndarray对象,例如:
np.array()
、np.zeros()
、np.ones()
?等等)来创建 ndarray 对象;reshape()
?函数改变数组的形状,或者通过?flatten()
?函数将多维数组转换为一维数组;concatenate()
?函数将多个数组拼接在一起,或者使用?split()
?函数将一个数组分裂为多个子数组;unique()
?函数查找数组中的相同元素;总之,NumPy 提供了大量的高效计算功能,使得 Python 成为了数据分析、机器学习、科学计算等领域的首选语言。在使用 NumPy 进行科学计算时,需要注意数组对象的维度、数据类型等性质,以便于进行各种操作和计算。
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成为了一种强大的科学计算语言。
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机器学习库。它提供了各种机器学习算法和数据预处理工具,使得开发者可以轻松地构建和应用机器学习模型,并进行数据分析和挖掘。它的文档详尽,拥有广泛的用户社区,为开发者提供了广阔的机器学习领域实践应用和资源。
from scipy.optimize import minimize
`scipy.optimize.minimize` 是 SciPy 库中的一个函数,用于最小化多元函数的目标值。它提供了多种优化算法,可以用于解决无约束或有约束的最小化问题。
具体来说,`minimize` 函数的使用方法如下:
from scipy.optimize import minimizeresult = 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 库中用于最小化多元函数的优化函数,通过指定目标函数和初始值,可以使用不同的优化算法求解无约束或有约束的最小化问题。
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,R2为1表示完美拟合,为0表示预测能力为随机准确率,为负数表示预测结果比随机还糟糕。其计算方法是将总变异分为已解释的变异和未解释的变异两部分,并将已解释的变异占总变异的比例作为模型拟合的好坏程度的指标,公式为:R2 = 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表示样本数量。
这三个方法都是用于评估机器学习模型的性能表现的指标。在模型训练完毕后,可以使用这些方法对模型的预测结果进行评估,从而调整模型的超参数,提高模型的准确度和泛化能力。
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` 可以根据行和列的位置灵活地提取数据,非常适用于需要按位置进行数据选择和操作的情况。
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 函数。该函数有三个参数:params
,x
,和?y
。函数的目标是通过计算数据?x
?经过线性变换后的预测值?y_pred
,并计算预测值和真实值?y
?的平方误差之和。
具体来说,函数的实现如下:
函数接受一个参数?params
,它是一个包含模型权重和偏差的数组。通过将?params
?划分为除最后一个元素以外的部分?a
?和最后一个元素?b
,可以获得模型权重和偏差。
预测值?y_pred
?通过将数据?x
?与权重?a
?做点积,再加上偏差?b
?得到。
平方误差通过计算预测值?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)
首先定义了一个约束条件,使用?'type':'eq'
?指定了等式类型的约束条件,并使用 lambda 函数将约束条件定义为参数?params
?的元素之和与 1 相等。
定义了用于初始参数猜测的?initial_guess
,它是一个包含 8 个随机值的数组。
使用?minimize
?函数最小化目标函数?objective
,传入初始参数猜测?initial_guess
、数据?(x, y)
,以及约束条件?constraints
。
从最小化结果?result
?中获取带约束条件的多元线性回归的系数?coefficients
,并获取截距?intercept
。
输出多元线性回归的系数和截距。
使用获得的模型参数进行预测,计算预测值?y_pred
。
使用?mean_squared_error
?函数计算均方误差(MSE)。
使用?r2_score
?函数计算R平方(R-squared)。
使用?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}")