paint-brush
Туршилтын шинжилгээнд давхаргажуулах аргыг ашиглахby@nataliaogneva
33,172 уншилтууд
33,172 уншилтууд

Туршилтын шинжилгээнд давхаргажуулах аргыг ашиглах

by Natalia Ogneva8m2024/04/19
Read on Terminal Reader
Read this story w/o Javascript

Хэтэрхий урт; Унших

Давхаргатай түүвэрлэлт нь өгөгдлийн шинжилгээнд туршилтын үр ашиг, хэмжүүрийн мэдрэмжийг нэмэгдүүлэх хүчирхэг арга юм. Үзэгчдээ бөөгнүүлж, тодорхой жингээр хувааснаар та туршилтыг оновчтой болгож, зөрүүг багасгаж, үр дүнгийн найдвартай байдлыг нэмэгдүүлэх боломжтой.

Company Mentioned

Mention Thumbnail
featured image - Туршилтын шинжилгээнд давхаргажуулах аргыг ашиглах
Natalia Ogneva HackerNoon profile picture
0-item


Аливаа туршилт нь хурдан үр дүн болон хэмжүүрийн мэдрэмжийн хоорондын солилцоог агуулдаг. Хэрэв сонгосон хэмжүүр нь хэлбэлзлийн хувьд өргөн байвал туршилтын үр дүнг үнэн зөв гаргахын тулд бид удаан хүлээх ёстой. Шинжээчдэд хэт их цаг хугацаа, хэмжүүрийн мэдрэмжийг алдалгүйгээр туршилтаа нэмэгдүүлэхэд туслах нэг аргыг авч үзье.


Асуудлын томъёолол

Бид шинэ эрэмбийн алгоритмыг туршихын тулд сессийн уртыг үндсэн хэмжүүр болгон стандарт туршилт явууллаа гэж бодъё. Нэмж дурдахад манай үзэгчдийг 1 сая өсвөр насныхан, 18-45 насны 2 сая хэрэглэгч, 45 ба түүнээс дээш насны 3 сая хэрэглэгч гэсэн гурван бүлэгт хувааж болно. Шинэ эрэмбийн алгоритмын хариу үйлдэл нь эдгээр үзэгчдийн бүлгүүдийн дунд ихээхэн ялгаатай байх болно. Энэхүү өргөн хүрээний өөрчлөлт нь хэмжүүрийн мэдрэмжийг бууруулдаг.


Өөрөөр хэлбэл, хүн амыг дараах байдлаар тодорхойлсон гурван давхаргад хувааж болно.


Бүрэлдэхүүн хэсэг бүр хэвийн тархалттай гэж хэлье. Дараа нь хүн амын үндсэн үзүүлэлт нь хэвийн тархалттай байдаг.

Давхаргажуулах арга

Бид хэрэглэгчдийнхээ ялгааг харгалзахгүйгээр сонгодог туршилтын загвараар нийт хэрэглэгчдийг санамсаргүй байдлаар хуваадаг . Тиймээс бид түүврийг дараах хүлээгдэж буй утга болон хэлбэлзэлтэй авч үзнэ.


Өөр нэг арга бол нийт хүн ам дахь давхаргын жингийн дагуу давхарга бүрийг санамсаргүй байдлаар хуваах явдал юм.

Энэ тохиолдолд хүлээгдэж буй утга ба хэлбэлзэл нь дараах байдалтай байна.


Хүлээгдэж буй утга нь эхний сонголттой ижил байна. Гэсэн хэдий ч хэлбэлзэл нь бага бөгөөд энэ нь өндөр хэмжигдэхүүн мэдрэмжийг баталгаажуулдаг.

Одоо Нейманы аргыг авч үзье. Тэд хэрэглэгчдийг тодорхой жинтэй давхарга бүрт санамсаргүй байдлаар хуваахыг санал болгож байна.

Тиймээс хүлээгдэж буй утга ба хэлбэлзэл нь энэ тохиолдолд дараахтай тэнцүү байна.

Хүлээгдэж буй утга нь эхний тохиолдолд асимптотик байдлаар хүлээгдэж буй утгатай тэнцүү байна. Гэсэн хэдий ч ялгаа нь хамаагүй бага байна.

Эмпирик туршилт

Бид энэ аргын үр ашгийг онолын хувьд нотолсон. Дээжийг дуурайж, давхрагын аргыг эмпирик байдлаар туршиж үзье.

Гурван тохиолдлыг авч үзье:

  • бүх давхаргууд нь тэнцүү дундаж болон хэлбэлзэлтэй,
  • янз бүрийн дундаж, ижил хэлбэлзэлтэй бүх давхарга,
  • бүх давхаргууд нь ижил утгатай, ялгаатай хэлбэлзэлтэй байдаг.

Бид бүх тохиолдолд бүх гурван аргыг хэрэглэж, тэдгээрийг харьцуулахын тулд гистограмм болон хайрцагны графикийг зурах болно.

Код бэлтгэх

Эхлээд Python хэл дээр гурван давхаргаас бүрдэх ерөнхий популяцийг дуурайлган ангийг үүсгэцгээе.

 class GeneralPopulation: def __init__(self, means: [float], stds: [float], sizes: [int], random_state: int = 15 ): """ Initializes our General Population and saves the given distributions :param means: List of expectations for normal distributions :param stds: List of standard deviations for normal distributions :param sizes: How many objects will be in each strata :param random_state: Parameter fixing randomness. Needed so that when conducting experiment repeatedly with the same input parameters, the results remained the same """ self.strats = [st.norm(mean, std) for mean, std in zip(means, stds)] self._sample(sizes) self.random_state = random_state def _sample(self, sizes): """Creates a general population sample as a mixture of strata :param sizes: List with sample sizes of the corresponding normal distributions """ self.strats_samples = [rv.rvs(size) for rv, size in zip(self.strats, sizes)] self.general_samples = np.hstack(self.strats_samples) self.N = self.general_samples.shape[0] # number of strata self.count_strats = len(sizes) # ratios for every strata in GP self.ws = [size/self.N for size in sizes] # ME and Std for GP self.m = np.mean(self.general_samples) self.sigma = np.std(self.general_samples) # ME and std for all strata self.ms = [np.mean(strat_sample) for strat_sample in self.strats_samples] self.sigmas = [np.std(strat_sample) for strat_sample in self.strats_samples]


Дараа нь онолын хэсэгт тайлбарласан түүвэрлэлтийн гурван аргын функцийг нэмье.

 def random_subsampling(self, size): """Creates a random subset of the entire population :param sizes: subsample size """ rc = np.random.choice(self.general_samples, size=size) return rc def proportional_subsampling(self, size): """Creates a subsample with the number of elements, proportional shares of strata :param sizes: subsample size """ self.strats_size_proport = [int(np.floor(size*w)) for w in self.ws] rc = [] for k in range(len(self.strats_size_proport)): rc.append(np.random.choice(self.strats_samples[k], size=self.strats_size_proport[k])) return rc def optimal_subsampling(self, size): """Creates a subsample with the optimal number of elements relative to strata :param sizes: subsample size """ sum_denom = 0 for k in range(self.count_strats): sum_denom += self.ws[k] * self.sigmas[k] self.strats_size_optimal = [int(np.floor((size*w*sigma)/sum_denom)) for w, sigma in zip(self.ws, self.sigmas)] if 0 in self.strats_size_optimal: raise ValueError('Strats size is 0, please change variance of smallest strat!') rc = [] for k in range(len(self.strats_size_optimal)): rc.append(np.random.choice(self.strats_samples[k], size=self.strats_size_optimal[k])) return rc


Түүнчлэн, эмпирик хэсгийн хувьд туршилтын үйл явцыг дуурайх функц бидэнд үргэлж хэрэгтэй байдаг.

 def run_experiments(self, n_sub, subsampling_method, n_experiments=1000): """Conducts a series of experiments and saves the results :param n_sub: size of sample :param subsampling_method: method for creating a subsample :param n_experiments: number of experiment starts """ means_s = [] if(len(self.general_samples)<100): n_sub = 20 if(subsampling_method == 'random_subsampling'): for n in range(n_experiments): rc = self.random_subsampling(n_sub) mean = rc.sum()/len(rc) means_s.append(mean) else: for n in range(n_experiments): if(subsampling_method == 'proportional_subsampling'): rc = self.proportional_subsampling(n_sub) elif(subsampling_method == 'optimal_subsampling'): rc = self.optimal_subsampling(n_sub) strats_mean = [] for k in range(len(rc)): strats_mean.append(sum(rc[k])/len(rc[k])) # Mean for a mixture means_s.append(sum([w_k*mean_k for w_k, mean_k in zip(self.ws, strats_mean)])) return means_s


Симуляцийн үр дүн

Хэрэв бид бүх давхаргууд ижил утгатай, хэлбэлзэлтэй байдаг нийт хүн амыг харвал бүх гурван аргын үр дүн их бага хэмжээгээр тэнцүү байх төлөвтэй байна.

Янз бүрийн арга хэрэгсэл, тэнцүү ялгаа нь илүү сэтгэл хөдөлгөм үр дүнд хүрсэн. Давхаргыг ашиглах нь зөрүүг эрс багасгадаг.

Тэнцүү дундаж, ялгаатай хэлбэлзэлтэй тохиолдлуудад бид Нейманы аргад дисперсийн бууралтыг харж байна.

Дүгнэлт

Одоо та үзэгчдээ кластер болгон, тодорхой жингээр кластер бүрт санамсаргүй байдлаар хуваах юм бол хэмжүүрийн зөрүүг багасгаж, туршилтыг нэмэгдүүлэхийн тулд давхраачлалын аргыг хэрэглэж болно!