Python: как избежать двойного l oop в этом случае и ускорить производительность? - PullRequest
1 голос
/ 17 марта 2020

Я новичок в python. Как мне векторизовать или применить приведенный ниже код вместо использования double для l oop?

Было бы замечательно, если бы я мог найти решение, которое значительно сократило бы время выполнения и ускорило бы производительность. Можно ли это сделать, используя векторизация или apply?

Каждая итерация двойного для l oop в основном заполняет запись в матрице CD_train. Внешний для l oop проходит через столбцы, а внутренний для l oop - через ряды.

Предположим,

p = 10
N = 20
K = 11

RDA_Sigma_Hat_k_Det - это 1 x 11 Series ,

# create a N x K matrix of zeros     
CD_train = pd.DataFrame(np.zeros((N,K)),index = np.arange(N),columns = np.arange(1,K+1)) # training class discriminants

for c_i in np.arange(K):
   for s_i in range(N):
       # each entry is a scalar
       CD_train.at[s_i,c_i+1] = -0.5 * np.log(RDA_Sigma_Hat_k_Det.iloc[c_i]) - 0.5 * (X_minus_MU.iloc[:,s_i].T).dot(SX.iloc[:,s_i])

Данные выглядят следующим образом:

RDA_Sigma_Hat_k_Det.to_dict()
Out[8]: 
{1: 1.0,
 2: 1.0,
 3: 1.0,
 4: 1.0,
 5: 1.0,
 6: 1.0,
 7: 1.0,
 8: 1.0,
 9: 1.0,
 10: 1.0,
 11: 1.0}


SX.iloc[0:11,0:20].to_dict()
Out[2]: 
{0: {'x.1': -0.6777063201168626,
  'x.2': -0.9017176491315951,
  'x.3': -0.21627653765171262,
  'x.4': 1.8309852247892016,
  'x.5': 0.2944516810197635,
  'x.6': 1.3920553697352451,
  'x.7': -0.6361820038552793,
  'x.8': 0.03585340860595837,
  'x.9': -0.882879689655477,
  'x.10': -1.049097984029799},
 1: {'x.1': -0.35170722429987955,
  'x.2': -0.8344687172494253,
  'x.3': -0.24868004543878153,
  'x.4': 1.292366090376059,
  'x.5': 0.1599772301293251,
  'x.6': 1.8643265683002037,
  'x.7': -0.5839681741154302,
  'x.8': 0.003921466566276677,
  'x.9': -0.4741540510775525,
  'x.10': -0.4667330454332436},
 2: {'x.1': 0.9094495341972316,
  'x.2': -0.4913267314916866,
  'x.3': -1.4395089566135637,
  'x.4': -0.29226701521622966,
  'x.5': -0.45278263887659,
  'x.6': 1.2871062144985885,
  'x.7': -1.0350956630677273,
  'x.8': 0.2829058022813902,
  'x.9': -0.7778711263844686,
  'x.10': 0.31749458660322155},
 3: {'x.1': 0.7349564284233978,
  'x.2': 0.29755496943376786,
  'x.3': -1.3341975563055901,
  'x.4': 0.8331087124827273,
  'x.5': -0.9324543915373287,
  'x.6': 0.5169646194531178,
  'x.7': -1.0100330247926,
  'x.8': -0.4582513787449055,
  'x.9': 0.38206961867066846,
  'x.10': -1.0151564692036192},
 4: {'x.1': 0.4100022015032635,
  'x.2': 0.4087743567773565,
  'x.3': -0.4539022614235512,
  'x.4': 0.8981593325809331,
  'x.5': -1.7365284277894346,
  'x.6': 0.060127120187668165,
  'x.7': 0.9970665904072039,
  'x.8': -1.1052933621805605,
  'x.9': 0.9765796384203767,
  'x.10': -0.30238465785384777},
 5: {'x.1': 0.1446055017035405,
  'x.2': 0.38808237773668885,
  'x.3': -0.3310389610642483,
  'x.4': 0.5898193933154383,
  'x.5': -1.6741433732526334,
  'x.6': 0.20057378381319488,
  'x.7': 0.6273926758490715,
  'x.8': -1.2666337009073732,
  'x.9': 0.9135745004577716,
  'x.10': -0.24700639682165998},
 6: {'x.1': -0.5136619033115216,
  'x.2': 0.9140035116869917,
  'x.3': 0.10370810174559295,
  'x.4': 0.8799451589534354,
  'x.5': -2.2383815331743695,
  'x.6': 0.27311217052088455,
  'x.7': 0.8466907607564382,
  'x.8': -0.09691624513798125,
  'x.9': 1.1381312742219276,
  'x.10': -0.24879279233882728},
 7: {'x.1': -0.9932567269653532,
  'x.2': 0.7251892029408994,
  'x.3': 0.8557395116371507,
  'x.4': 1.8205771255734884,
  'x.5': -1.9888413150271642,
  'x.6': -0.20378913783392602,
  'x.7': -0.734344003766196,
  'x.8': 0.8139844172571485,
  'x.9': 1.4580035131089988,
  'x.10': -0.13267708372294978},
 8: {'x.1': -0.908622346320559,
  'x.2': 0.5622398679956415,
  'x.3': -0.5794658540984434,
  'x.4': 0.41158069424635496,
  'x.5': -0.4084199334281979,
  'x.6': 1.4723106060926894,
  'x.7': -0.8951625993649315,
  'x.8': 0.7064241914392734,
  'x.9': 0.2592903754614896,
  'x.10': -0.3702676875062069},
 9: {'x.1': -0.6871101401885067,
  'x.2': 0.300141466813851,
  'x.3': -1.1721800173702455,
  'x.4': 1.569481731994415,
  'x.5': 0.617467630065868,
  'x.6': 1.3148868732377033,
  'x.7': -0.799089152643609,
  'x.8': 0.32660214401990206,
  'x.9': 0.6260125887310106,
  'x.10': -1.0883986854074803},
 10: {'x.1': -0.0434708997293346,
  'x.2': 0.23720336389848712,
  'x.3': -0.8521953779729399,
  'x.4': 0.4753303019425965,
  'x.5': -0.6288471261248959,
  'x.6': 1.0201032166170922,
  'x.7': -1.0267414503093515,
  'x.8': 0.2879476878666032,
  'x.9': 0.5000023128058007,
  'x.10': -1.0651755436843047},
 11: {'x.1': -0.692334484672753,
  'x.2': -0.9405151098328469,
  'x.3': -0.12176630660609486,
  'x.4': 1.7347103070438572,
  'x.5': 0.21958961557560192,
  'x.6': 1.6050404200684618,
  'x.7': -0.5630826422194906,
  'x.8': 0.049298436833192766,
  'x.9': -0.7584849300882825,
  'x.10': -1.0473115885126312},
 12: {'x.1': -0.25766902358344224,
  'x.2': -0.8861986648510946,
  'x.3': -0.4728043076326747,
  'x.4': 1.2897640655721312,
  'x.5': 0.17938591376299665,
  'x.6': 1.8365459095610885,
  'x.7': -0.6508018761824372,
  'x.8': 0.4089529419117124,
  'x.9': -0.7213280538539257,
  'x.10': -0.17912336716930083},
 13: {'x.1': 0.8937765007444923,
  'x.2': -0.43959678389001744,
  'x.3': -1.515117141450058,
  'x.4': -0.32609333766729653,
  'x.5': -0.44862363524080323,
  'x.6': 1.350384381626573,
  'x.7': -1.137434769357832,
  'x.8': 0.3450890578323492,
  'x.9': -0.9297296640379267,
  'x.10': 0.3567952879809032},
 14: {'x.1': 0.7171936571769593,
  'x.2': 0.2760008245997389,
  'x.3': -1.3449987255679463,
  'x.4': 0.7927773280218399,
  'x.5': -0.8049116133732016,
  'x.6': 0.12494865724560347,
  'x.7': -0.4398580040334463,
  'x.8': -0.8565603399767243,
  'x.9': 0.7213280538539257,
  'x.10': -0.952632626102762},
 15: {'x.1': 0.4706045975205235,
  'x.2': 0.5863805102097538,
  'x.3': -0.6942282775109789,
  'x.4': 0.7303287327275624,
  'x.5': -1.6450303478021255,
  'x.6': 0.46140330197488744,
  'x.7': 0.5668246333508464,
  'x.8': -0.9321886237549177,
  'x.9': 1.028276161876873,
  'x.10': -0.7257603954225089},
 16: {'x.1': 0.1717720930216222,
  'x.2': 0.46481513334583135,
  'x.3': -0.30808647638174114,
  'x.4': 0.5585950956682996,
  'x.5': -1.7864364714188756,
  'x.6': 0.33021685792906585,
  'x.7': 0.6858721651577027,
  'x.8': -1.2851206147198204,
  'x.9': 0.9426537949020508,
  'x.10': -0.41314117991822313},
 17: {'x.1': -0.6181487929964522,
  'x.2': 0.7846786426828188,
  'x.3': 0.2049690635801833,
  'x.4': 1.0282605727773442,
  'x.5': -2.1801554822733547,
  'x.6': -0.16057477979530238,
  'x.7': 0.8821961649795357,
  'x.8': -0.25657595533638966,
  'x.9': 1.1995208958265169,
  'x.10': -0.05764847200192125},
 18: {'x.1': -1.003705415933846,
  'x.2': 0.6777700843060359,
  'x.3': 0.8597899501105342,
  'x.4': 1.8218781379754525,
  'x.5': -2.1149977586460285,
  'x.6': -0.2439167560126478,
  'x.7': -0.7280783441974141,
  'x.8': 0.9030577292625762,
  'x.9': 1.4951603893433556,
  'x.10': -0.11838591958561101},
 19: {'x.1': -0.8281674412631627,
  'x.2': 0.4398123253383578,
  'x.3': -0.9318540012828176,
  'x.4': 0.3048976772852978,
  'x.5': -0.3737615697966416,
  'x.6': 1.2022208683512918,
  'x.7': -0.10568949369841144,
  'x.8': 0.03417278007755406,
  'x.9': 1.1623640195921603,
  'x.10': -0.6310814330126395}}

X_minus_MU.iloc[0:11,0:20].to_dict()
Out[6]: 
{0: {'x.1': -0.6777063201168626,
  'x.2': -0.9017176491315951,
  'x.3': -0.21627653765171262,
  'x.4': 1.8309852247892016,
  'x.5': 0.2944516810197635,
  'x.6': 1.3920553697352451,
  'x.7': -0.6361820038552793,
  'x.8': 0.03585340860595837,
  'x.9': -0.882879689655477,
  'x.10': -1.049097984029799},
 1: {'x.1': -0.35170722429987955,
  'x.2': -0.8344687172494253,
  'x.3': -0.24868004543878153,
  'x.4': 1.292366090376059,
  'x.5': 0.1599772301293251,
  'x.6': 1.8643265683002037,
  'x.7': -0.5839681741154302,
  'x.8': 0.003921466566276677,
  'x.9': -0.4741540510775525,
  'x.10': -0.4667330454332436},
 2: {'x.1': 0.9094495341972316,
  'x.2': -0.4913267314916866,
  'x.3': -1.4395089566135637,
  'x.4': -0.29226701521622966,
  'x.5': -0.45278263887659,
  'x.6': 1.2871062144985885,
  'x.7': -1.0350956630677273,
  'x.8': 0.2829058022813902,
  'x.9': -0.7778711263844686,
  'x.10': 0.31749458660322155},
 3: {'x.1': 0.7349564284233978,
  'x.2': 0.29755496943376786,
  'x.3': -1.3341975563055901,
  'x.4': 0.8331087124827273,
  'x.5': -0.9324543915373287,
  'x.6': 0.5169646194531178,
  'x.7': -1.0100330247926,
  'x.8': -0.4582513787449055,
  'x.9': 0.38206961867066846,
  'x.10': -1.0151564692036192},
 4: {'x.1': 0.4100022015032635,
  'x.2': 0.4087743567773565,
  'x.3': -0.4539022614235512,
  'x.4': 0.8981593325809331,
  'x.5': -1.7365284277894346,
  'x.6': 0.060127120187668165,
  'x.7': 0.9970665904072039,
  'x.8': -1.1052933621805605,
  'x.9': 0.9765796384203767,
  'x.10': -0.30238465785384777},
 5: {'x.1': 0.1446055017035405,
  'x.2': 0.38808237773668885,
  'x.3': -0.3310389610642483,
  'x.4': 0.5898193933154383,
  'x.5': -1.6741433732526334,
  'x.6': 0.20057378381319488,
  'x.7': 0.6273926758490715,
  'x.8': -1.2666337009073732,
  'x.9': 0.9135745004577716,
  'x.10': -0.24700639682165998},
 6: {'x.1': -0.5136619033115216,
  'x.2': 0.9140035116869917,
  'x.3': 0.10370810174559295,
  'x.4': 0.8799451589534354,
  'x.5': -2.2383815331743695,
  'x.6': 0.27311217052088455,
  'x.7': 0.8466907607564382,
  'x.8': -0.09691624513798125,
  'x.9': 1.1381312742219276,
  'x.10': -0.24879279233882728},
 7: {'x.1': -0.9932567269653532,
  'x.2': 0.7251892029408994,
  'x.3': 0.8557395116371507,
  'x.4': 1.8205771255734884,
  'x.5': -1.9888413150271642,
  'x.6': -0.20378913783392602,
  'x.7': -0.734344003766196,
  'x.8': 0.8139844172571485,
  'x.9': 1.4580035131089988,
  'x.10': -0.13267708372294978},
 8: {'x.1': -0.908622346320559,
  'x.2': 0.5622398679956415,
  'x.3': -0.5794658540984434,
  'x.4': 0.41158069424635496,
  'x.5': -0.4084199334281979,
  'x.6': 1.4723106060926894,
  'x.7': -0.8951625993649315,
  'x.8': 0.7064241914392734,
  'x.9': 0.2592903754614896,
  'x.10': -0.3702676875062069},
 9: {'x.1': -0.6871101401885067,
  'x.2': 0.300141466813851,
  'x.3': -1.1721800173702455,
  'x.4': 1.569481731994415,
  'x.5': 0.617467630065868,
  'x.6': 1.3148868732377033,
  'x.7': -0.799089152643609,
  'x.8': 0.32660214401990206,
  'x.9': 0.6260125887310106,
  'x.10': -1.0883986854074803},
 10: {'x.1': -0.0434708997293346,
  'x.2': 0.23720336389848712,
  'x.3': -0.8521953779729399,
  'x.4': 0.4753303019425965,
  'x.5': -0.6288471261248959,
  'x.6': 1.0201032166170922,
  'x.7': -1.0267414503093515,
  'x.8': 0.2879476878666032,
  'x.9': 0.5000023128058007,
  'x.10': -1.0651755436843047},
 11: {'x.1': -0.692334484672753,
  'x.2': -0.9405151098328469,
  'x.3': -0.12176630660609486,
  'x.4': 1.7347103070438572,
  'x.5': 0.21958961557560192,
  'x.6': 1.6050404200684618,
  'x.7': -0.5630826422194906,
  'x.8': 0.049298436833192766,
  'x.9': -0.7584849300882825,
  'x.10': -1.0473115885126312},
 12: {'x.1': -0.25766902358344224,
  'x.2': -0.8861986648510946,
  'x.3': -0.4728043076326747,
  'x.4': 1.2897640655721312,
  'x.5': 0.17938591376299665,
  'x.6': 1.8365459095610885,
  'x.7': -0.6508018761824372,
  'x.8': 0.4089529419117124,
  'x.9': -0.7213280538539257,
  'x.10': -0.17912336716930083},
 13: {'x.1': 0.8937765007444923,
  'x.2': -0.43959678389001744,
  'x.3': -1.515117141450058,
  'x.4': -0.32609333766729653,
  'x.5': -0.44862363524080323,
  'x.6': 1.350384381626573,
  'x.7': -1.137434769357832,
  'x.8': 0.3450890578323492,
  'x.9': -0.9297296640379267,
  'x.10': 0.3567952879809032},
 14: {'x.1': 0.7171936571769593,
  'x.2': 0.2760008245997389,
  'x.3': -1.3449987255679463,
  'x.4': 0.7927773280218399,
  'x.5': -0.8049116133732016,
  'x.6': 0.12494865724560347,
  'x.7': -0.4398580040334463,
  'x.8': -0.8565603399767243,
  'x.9': 0.7213280538539257,
  'x.10': -0.952632626102762},
 15: {'x.1': 0.4706045975205235,
  'x.2': 0.5863805102097538,
  'x.3': -0.6942282775109789,
  'x.4': 0.7303287327275624,
  'x.5': -1.6450303478021255,
  'x.6': 0.46140330197488744,
  'x.7': 0.5668246333508464,
  'x.8': -0.9321886237549177,
  'x.9': 1.028276161876873,
  'x.10': -0.7257603954225089},
 16: {'x.1': 0.1717720930216222,
  'x.2': 0.46481513334583135,
  'x.3': -0.30808647638174114,
  'x.4': 0.5585950956682996,
  'x.5': -1.7864364714188756,
  'x.6': 0.33021685792906585,
  'x.7': 0.6858721651577027,
  'x.8': -1.2851206147198204,
  'x.9': 0.9426537949020508,
  'x.10': -0.41314117991822313},
 17: {'x.1': -0.6181487929964522,
  'x.2': 0.7846786426828188,
  'x.3': 0.2049690635801833,
  'x.4': 1.0282605727773442,
  'x.5': -2.1801554822733547,
  'x.6': -0.16057477979530238,
  'x.7': 0.8821961649795357,
  'x.8': -0.25657595533638966,
  'x.9': 1.1995208958265169,
  'x.10': -0.05764847200192125},
 18: {'x.1': -1.003705415933846,
  'x.2': 0.6777700843060359,
  'x.3': 0.8597899501105342,
  'x.4': 1.8218781379754525,
  'x.5': -2.1149977586460285,
  'x.6': -0.2439167560126478,
  'x.7': -0.7280783441974141,
  'x.8': 0.9030577292625762,
  'x.9': 1.4951603893433556,
  'x.10': -0.11838591958561101},
 19: {'x.1': -0.8281674412631627,
  'x.2': 0.4398123253383578,
  'x.3': -0.9318540012828176,
  'x.4': 0.3048976772852978,
  'x.5': -0.3737615697966416,
  'x.6': 1.2022208683512918,
  'x.7': -0.10568949369841144,
  'x.8': 0.03417278007755406,
  'x.9': 1.1623640195921603,
  'x.10': -0.6310814330126395}}

Обновление: Я понял, что всегда должен использовать массивы numpy, когда дело доходит до матричные операции с циклами, потому что это намного быстрее по сравнению с pandas dataaframe / series. Это значительно ускоряет всю функцию, хотя все еще медленно.

1 Ответ

1 голос
/ 19 марта 2020

Я не знаю, как эффективно решить проблему, используя метод pandas.DataFrame.apply().

Однако, используя векторы, это можно сделать гораздо проще. Все, что вам нужно сделать, это сделать фрейм данных CD_train, состоящий из скорректированных рядов RDA_Sigma_Hat_k_Det в виде строк. После этого вы используете метод pandas.DataFrame.add() для добавления серии продуктов столбцов X_minus_MU и SX к каждому столбцу в CD_train фрейме данных.

Код следующий:

CD_train = pd.DataFrame()
CD_train = CD_train.append(
    [-0.5 * np.log(RDA_Sigma_Hat_k_Det).to_frame().T] * N, ignore_index=True)
CD_train = CD_train.add(-0.5 * (X_minus_MU * SX).sum(), axis=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...