我试图重新创建最大似然分布拟合,我已经可以在Matlab和R中做到这一点,但现在我想使用scipy.特别是,我想估计我的数据集的Weibull分布参数.
我试过这个:
import scipy.stats as s
import numpy as np
import matplotlib.pyplot as plt
def weib(x,n,a):
return (a / n) * (x / n)**(a - 1) * np.exp(-(x / n)**a)
data = np.loadtxt("stack_data.csv")
(loc, scale) = s.exponweib.fit_loc_scale(data, 1, 1)
print loc, scale
x = np.linspace(data.min(), data.max(), 1000)
plt.plot(x, weib(x, loc, scale))
plt.hist(data, data.max(), normed=True)
plt.show()
Run Code Online (Sandbox Code Playgroud)
得到这个:
(2.5827280639441961, 3.4955032285727947)
Run Code Online (Sandbox Code Playgroud)
并且看起来像这样的分布:

我一直exponweib在阅读http://www.johndcook.com/distributions_scipy.html.我也尝试了scipy中的其他Weibull函数(以防万一!).
在Matlab(使用分布拟合工具 - 参见屏幕截图)和R(使用MASS库函数fitdistr和GAMLSS包)中,我得到(loc)和b(比例)参数更像1.58463497 5.93030013.我相信所有三种方法都使用最大似然法进行分布拟合.

如果你想去,我已经在这里发布了我的数据!为了完整起见,我使用的是Python 2.7.5,Scipy 0.12.0,R 2.15.2和Matlab 2012b.
为什么我会得到不同的结果!?
我正在遵循一些代码,我可以应用所有内容,直到我得到命令:
s1 %*% cc1$xcoef
Run Code Online (Sandbox Code Playgroud)
这条线对我不起作用,我找不到解释它的目的的文档.我收到此错误:
Error in s1 %*% cc1$xcoef : non-conformable arguments
Run Code Online (Sandbox Code Playgroud)
我%*%能做什么,可以使用其他功能吗?
我正在使用R版本3.0.3(2014-03-06)"温暖的小狗"
是否存在累积密度函数的精确导数是概率密度函数(PDF)?我正在使用计算导数numpy.diff(),这是正确的吗?见下面的代码:
import scipy.stats as s
import matplotlib.pyplot as plt
import numpy as np
wei = s.weibull_min(2, 0, 2) # shape, loc, scale - creates weibull object
sample = wei.rvs(1000)
shape, loc, scale = s.weibull_min.fit(sample, floc=0)
x = np.linspace(np.min(sample), np.max(sample))
plt.hist(sample, normed=True, fc="none", ec="grey", label="frequency")
plt.plot(x, wei.cdf(x), label="cdf")
plt.plot(x, wei.pdf(x), label="pdf")
plt.plot(x[1:], np.diff(wei.cdf(x)), label="derivative")
plt.legend(loc=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)

如果是这样,我如何缩放衍生物以等同于PDF?
我有一个大数组(~500k 行 x 9 列),我想在使用 Pythonmultiprocessing模块运行多个并行进程时共享它。我正在使用这个 SO答案来创建我的共享数组,我从这个 SO答案中了解到该数组已被锁定。但是,在我的情况下,因为我从来没有同时写入同一行,所以锁是多余的,会增加处理时间。
lock=False但是,当我指定时,出现错误。
我的代码是这样的:
shared_array_base = multiprocessing.Array(ctypes.c_double, 90, lock=False)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(-1, 9)
Run Code Online (Sandbox Code Playgroud)
错误是这样的:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-15-d89681d70c37> in <module>()
1 shared_array_base = multiprocessing.Array(ctypes.c_double, len(np.unique(value)) * 9, lock=False)
----> 2 shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
3 shared_array = shared_array.reshape(-1, 9)
AttributeError: 'c_double_Array_4314834' object has no attribute 'get_obj'
Run Code Online (Sandbox Code Playgroud)
我的问题是如何共享每次写入时未锁定的 numpy 数组?
我想知道使用 PCL 的点云中的点数。点云是使用创建的pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_z(new pcl::PointCloud<pcl::PointXYZ>);。然后使用过滤器进行填充,该过滤器基本上从较大的点云创建子集。点云是无组织的。
我猜我需要归还width,但不知道如何做到这一点。当然,这是一个简单的答案,但我是 c++ 和 PCL 的新手。