перераспределить данные в гауссовом распределении с помощью pd.DataFrame

1

У меня есть pandas DataFrame, которые содержат вероятности каждого образца, принадлежащего каждому классу (столбцам). Так получилось, что почти 99% классов имеют < 0.01 вероятность, а очень немногие имеют > 0.5 вероятности. По какой-то причине я хочу, чтобы вероятности распределялись по гауссовскому распределению между 0 и 1. Я предполагаю, что в этом случае среднее значение должно быть равным 0.5, но я хотел бы также иметь возможность модифицировать среднее значение такого распределения, если это возможно. Я хочу эту операцию для каждой строки отдельно, как я могу это сделать, используя dataframe pandas?

Теги:
pandas
numpy
python-3.x
normal-distribution

1 ответ

1
Лучший ответ

Если вы хотите воспроизвести более гауссовское распределение, вы говорите о важности отдельных точек (оценка класса подряд).
Поэтому я бы предложил использовать гуасианские распределенные веса для усиления оценки.
Вот пример:

import numpy as np
import pandas as pd
#Preparation of the data
nclasses = 10
nsamples = 5
df_c = []
for nc in range( nsamples ):
    a = np.random.rand(nclasses)
    a = [n/np.sum(a) for n in a]
    df_c.append( a )

df = pd.DataFrame(df_c)

# Now let weight

for nr in range( df[0].count() ): #iterate over rows
    a = df.iloc[nr] #capture the nth row
    #generate Gaussian weights
    gw = np.random.normal( np.mean(a), np.std(a), len(a) )
    #sort gw and a in order to assign one to the other
    gw = np.sort(gw)
    b_ind = np.argsort(a) #indexes to sort a
    b = a[b_ind]          #sorted version of a
    # now weight the row
    aw_r = a*b # you can reduce the entity adding anotherfactor, like 0.8 for instance
    # back from sort
    aw = [ aw_r[n] for n in b_ind ]
    #update the dataframe
    df.iloc[nr] = aw

# there you go!

Надеюсь, это будет полезно

Обновление __
Если вы хотите настроить среднее значение каждой строки на одно и то же значение, например 0,5, вам просто нужно вычесть разницу между средним значением строки и целевым средним значением (в данном случае - 0,5).

a=np.array([1,2,3,47,2,6])
print( a.mean() ) # 10.1666
target_mean = 0.5

a_adj = a-(np.mean(a) - target_mean)
print( np.mean( a_adj ) ) # 0.5

Это означает, что в главном примере выше, прежде чем подставлять aw в df.iloc [nr], вы должны сделать

aw = aw-(np.mean(aw) - 0.5)
  • 0
    Спасибо за этот ответ! Кстати, как я могу настроить среднее распределение в этом коде?
  • 0
    Вы хотите настроить среднее значение для одной строки, оставляя каждую строку отличной от других, или вы хотите получить уникальное среднее значение для всех строк?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню