我有一个 collections.Counter 对象,其中包含不同值出现次数的计数,如下所示:
1:193260
2:51794
3:19112
4:9250
5:6486
Run Code Online (Sandbox Code Playgroud)
如何在 scipy 中拟合该数据的概率分布?scipy.stats.expon.fit() 似乎需要一个数字列表。创建一个包含 193260 [1]、51794 [2] 等的列表似乎很浪费。有没有更优雅或更有效的方法?
我编写了下面的代码,以使高斯曲线适合直方图.它似乎有效,虽然Y缩放是不同的.我究竟做错了什么?
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.mlab as mlab
list = [0,1,1,2,2,2,3,3,4]
plt.figure(1)
plt.hist(list)
plt.xlim((min(list), max(list)))
mean = np.mean(list)
variance = np.var(list)
sigma = np.sqrt(variance)
x = np.linspace(min(list), max(list),100)
plt.plot(x,mlab.normpdf(x,mean,sigma))
plt.show()
Run Code Online (Sandbox Code Playgroud)
谢谢!
在 scikit-learn 中使用 GMM 拟合高斯峰似乎适用于离散数据点。有没有办法将 GMM 与已经分箱或聚合成直方图的数据一起使用?
例如,以下代码是一种变通方法,它在拟合之前将分箱数据转换为离散数据点:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import mixture
def fit_one_peak(x, linspace):
gmm = mixture.GMM(n_components=1) # gmm for one components
gmm.fit(x) # train it!
m1 = gmm.means_
w1 = gmm.weights_
return np.exp(gmm.score_samples(linspace)[0]), m1[0][0], w1[0]
def convert_to_signal(d, s):
c = []
count = 0
for i in s:
for j in range(int(d[count])): # No floats!
c.append(i)
count += 1
return c
d = [0.5, 2, 5, 3, 1, 0.5] # …Run Code Online (Sandbox Code Playgroud) 我有这个代码
df1 = df['T1'].values
df1 = df1 [~np.isnan(df1 )].tolist()
plt.hist(df1 , bins='auto', range=(0,100))
plt.show()
Run Code Online (Sandbox Code Playgroud)
这给我这张图
和这段代码
df2 = df['T2'].values
df2 = df2 [~np.isnan(df2 )].tolist()
plt.hist(df2 , bins='auto', range=(0,100))
plt.show()
Run Code Online (Sandbox Code Playgroud)
这给我这个
有什么方法可以将直方图转换为曲线,然后将它们组合在一起?
像这样