[ad_1]
Một phương pháp tối ưu hóa số phổ biến, có hiệu suất cao là phương pháp Brent. Phương pháp Brent là một thuật toán tìm nghiệm kết hợp nhiều kỹ thuật khác nhau như phương pháp chia đôi, phương pháp cát tuyến và phép nội suy bậc hai nghịch đảo. Bạn có thể tìm thêm thông tin chi tiết về việc triển khai nó trong Statsmodels đây.
Trong Python, việc triển khai trông như thế này:
def solve_power(self, effect_size=None, nobs1=None, alpha=None, energy=None,
ratio=1., different='two-sided'):
print('--- Arguments: ---')
print('effect_size:', effect_size, 'nobs1:', nobs1, 'alpha:', alpha, 'energy:', energy, 'ratio:', ratio, 'different:', different, 'n')# Examine that solely nobs1 is None
kwds = dict(effect_size=effect_size, nobs1=nobs1, alpha=alpha,
energy=energy, ratio=ratio, different=different)
key = (okay for okay,v in kwds.objects() if v is None)
assert(key == ('nobs1'))
# Examine that the effect_size shouldn't be 0
if kwds('effect_size') == 0:
elevate ValueError('Can't detect an effect-size of 0. Attempt altering your effect-size.')
# Initialize the counter
self._counter = 0
# Outline the perform that we wish to discover the foundation of
# We wish to discover nobs1 s.t. present energy = goal energy, i.e. present energy - goal energy = 0
# So func = present energy - goal energy
def func(x):
kwds('nobs1') = x
target_power = kwds.pop('energy') # at all times the identical goal energy laid out in key phrases, e.g. 0.8
current_power = self.energy(**kwds) # present energy given the present nobs1, notice that self.energy doesn't have energy as an argument
kwds('energy') = target_power # add again energy to kwds
fval = current_power - target_power
print(f'Iteration {self._counter}: nobs1 = {x}, present energy - goal energy = {fval}')
self._counter += 1
return fval
# Get the beginning values for nobs1, given the brentq_expanding algorithm
# Within the unique code, that is the self.start_bqexp dictionary arrange within the __init__ methodology
bqexp_fit_kwds = {'low': 2., 'start_upp': 50.}
# Clear up for nobs1 utilizing brentq_expanding
print('--- Fixing for optimum nobs1: ---')
val, _ = brentq_expanding(func, full_output=True, **bqexp_fit_kwds)
return val
1.2. Viết một phiên bản rút gọn của tt_ind_solve_power là một triển khai chính xác của đạo hàm thống kê và tạo ra kết quả đầu ra giống như hàm ban đầu
File nguồn trong Statsmodels có sẵn đây. Mặc dù hàm ban đầu được viết để mạnh mẽ hơn nhưng tính khái quát của nó cũng khiến việc trực quan về cách hoạt động của mã trở nên khó khăn hơn.
Do đó, tôi đã xem xét từng dòng mã nguồn và đơn giản hóa nó từ 1.600 dòng mã xuống còn 160 và từ hơn 10 hàm xuống chỉ còn 2, trong khi vẫn đảm bảo việc triển khai đó vẫn giống hệt nhau.
Mã rút gọn chỉ chứa hai hàm trong lớp TTestIndPower, tuân theo chính xác đạo hàm thống kê được giải thích trong Phần 1:
- quyền lựctính toán công suất cho một cỡ mẫu
- giải quyếttìm cỡ mẫu tối thiểu để đạt được công suất mục tiêu bằng phương pháp Brent
Đây là mã đầy đủ cho phiên bản rút gọn có kiểm tra để kiểm tra xem nó có tạo ra kết quả giống như hàm ban đầu hay không:
[ad_2]
Source link