Python拟合分布生成随机数

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from fitter import Fitter
import warnings

#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi'] # 指定默认字体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题

warnings.filterwarnings("ignore")
pd.set_option('display.max_columns',20)  
pd.set_option('display.max_rows',20) 
#禁用科学计数法
np.set_printoptions(suppress=True,   precision=10,  threshold=2000,  linewidth=150)  
pd.set_option('display.float_format',lambda x : '%.4f' % x)
%matplotlib inline
data = pd.read_excel(r"附件2 近5年8家转运商的相关数据.xlsx")
data
转运商IDW001W002W003W004W005W006W007W008W009...W231W232W233W234W235W236W237W238W239W240
0T11.55391.63900.81241.22331.11941.15721.07691.11941.9129...1.72401.54921.58701.34141.44531.59641.81371.70511.82791.9224
1T20.70921.24110.35461.59571.06380.70920.53191.06381.4184...0.17731.24110.70920.35460.17730.35460.53190.88650.35460.7092
2T30.00000.00000.09710.00000.12950.00000.03240.00000.0000...0.00000.00000.03240.00000.09710.00000.06470.00000.12950.0000
3T40.00000.00000.00000.00000.00000.00000.00000.00000.0000...0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
4T50.00000.00000.00000.00000.00000.00000.00000.00001.7391...0.00000.00000.00000.00000.00000.00000.00000.00000.00000.0000
5T60.01060.02220.04542.26211.63875.00000.04120.02640.0254...0.00740.00530.00530.00110.00530.00320.00320.00000.00000.0000
6T70.97830.90851.25790.97831.39761.60731.18801.25795.0000...1.74701.39761.04821.53741.11811.39761.04821.39761.60731.2579
7T80.33900.00000.00000.00001.01690.84750.84750.67800.3390...0.67805.00005.00000.67800.33900.16950.33900.67800.33900.6780

8 rows × 241 columns

一共为8家转运商240周的损耗率数据, T 1 . . . . T 8 T_1....T_8 T1....T8分别代表8家转运商. W 001 − W 240 W_{001}-W_{240} W001W240代表转运商1-240周的数据

任务:已知8家转运商240周转运的历史数据,现要选择转运商进行转运,问应如何得到转运商此次转运的损耗率

题目来源--2021年数学建模国赛C题

思路

1、直接利用历史数据的平均值。
2、利用历史数据的均值和方差生成新的随机数。
3、利用历史数据,拟合分布,利用分布生成新的数据。
4、时间序列预测

首先查看数据分布

plt.figure(figsize=(30,15),dpi=300)
for i in range(8):
    plt.subplot(2,4,i+1)
    plt.title("T"+str(i+1))
    plt.ylabel("损耗率%")
    plt.xlabel("周数")
    y = list(data.iloc[i][1:])
    x = [i+1 for i in range(len(y))]
    plt.scatter(x,y)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z6bH16Tz-1636028373985)(output_3_0.png)]

可以看出,数据并没有很明显的分布,因此不考虑用时间序列预测

而直接利用历史数据的平均值,受到异常点的影响过大且没有考虑到转运商的转运稳定性,因此不考虑平均值。

利用历史数据的均值和方差生成新的随机数,会导致生成的新数据不稳定,因此也不在此考虑。

我们使用历史数据来拟合一个分布,作为新数据的近似。

1、第一种我们可以使用已有的分布来进行拟合
2、第二种方法我们可以使用核密度估计(kde)来进行拟合

首先观察数据的分布

plt.figure(figsize=(30,15),dpi=300)
for i in range(8):
    plt.subplot(2,4,i+1)
    plt.title("转运商T"+str(i+1))
    plt.ylabel("损耗率%")
    plt.xlabel("周数")
    y = list(data.iloc[i][1:])
    #x = [i+1 for i in range(len(y))]
    sns.distplot(y)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PlnkdRIU-1636028373994)(output_5_0.png)]

我们拟合分布,以第一家转运商的数据为例

distributions (list) – 给出要查看的分布列表。 如果没有,则尝试所有的scipy分布(80种),常用的分布distributions=[‘norm’,‘t’,‘laplace’,‘cauchy’, ‘chi2’,’ expon’, ‘exponpow’, ‘gamma’,’ lognorm’, ‘uniform’];
但是80种都进行拟合会用较多时间,因此目前只拟合几种常用的分布。
若要全部拟合,设置distributions为默认即可

f = Fitter(list(data.iloc[i][1:]), distributions=['norm', 't', 'laplace', 'rayleigh'])
f.fit()
f.summary()
 
  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
可以使用Python中的NumPy、SciPy和Scikit-Learn库来生成随机数并进行GMM聚类。 首先,需要导入所需的库: ```python import numpy as np from scipy.stats import multivariate_normal from sklearn.mixture import GaussianMixture ``` 接下来,可以使用numpy库中的random模块来生成随机数。以下是一个生成100个二维随机数的示例: ```python np.random.seed(0) X = np.random.randn(100, 2) ``` 在这里,我们使用了numpy.seed()方法来设置随机数生成器的种子,以确保每次运行代码时生成随机数相同。 接下来,可以使用GMM算法对这些随机数进行聚类。以下是一个使用Scikit-Learn库中的GaussianMixture类进行聚类的示例: ```python gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=0) gmm.fit(X) labels = gmm.predict(X) ``` 在这里,我们使用了Scikit-Learn库中的GaussianMixture类来定义GMM模型。其中,n_components参数指定要聚类的簇数,covariance_type参数指定协方差矩阵的类型,random_state参数指定随机数生成器的种子。 接下来,我们使用fit()方法来模型,并使用predict()方法来预测每个数据点所属的簇。 最后,我们可以将数据点和它们的标签可视化。以下是一个使用Matplotlib库进行可视化的示例: ```python import matplotlib.pyplot as plt plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') plt.show() ``` 在这里,我们使用了Matplotlib库中的scatter()方法来绘制数据点,并使用c参数指定每个数据点的标签,以便按簇对其进行颜色编码。 完整的代码示例如下: ```python import numpy as np from scipy.stats import multivariate_normal from sklearn.mixture import GaussianMixture import matplotlib.pyplot as plt # 生成随机数 np.random.seed(0) X = np.random.randn(100, 2) # GMM聚类 gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=0) gmm.fit(X) labels = gmm.predict(X) # 可视化 plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis') plt.show() ``` 运行该代码将生成一个二维散点图,其中每个数据点的颜色表示其所属的簇。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kilig*

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

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

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

打赏作者

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

抵扣说明:

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

余额充值