2015-03-25 3 views
1

У меня есть 3 набора данных, которые содержат прогнозы, имена пользователей и метки соответственно. Используя приведенный ниже код, я усредняю ​​прогнозы пользователей (на основе помощи от Jaime и ali_m от Average using grouping value in another vector (numpy/Python)). Этикетки связаны с каждым наблюдением, и поэтому имеется избыточная информация. Я хотел бы найти уникальный ярлык для каждого пользователя, используя idx. Как это сделать в NumPy?Прикрепите информацию о ярлыке при усреднении прогнозов для пользователей

>>> pred 
    [ 0.99 0.23 0.11 0.64 0.45 0.55 0.76 0.72 0.97 ] 
>>> users 
    ['User2' 'User3' 'User2' 'User3' 'User0' 'User1' 'User4' 'User4' 'User4'] 
>>> label 
    [ 1 0 1 0 0 1 0 0 0 ] 

unq, idx, cnt = np.unique(user_data, return_inverse=True, return_counts=True) # assign integer indices to each unique user name, and get the total number of occurrences for each name 
predictions_user = np.bincount(idx, weights=pred)/cnt # now sum the values of pred corresponding to each index value and divide to get the mean 

Выход в настоящее время:

>>> unq 
array(['User0', 'User1', 'User2', 'User3', 'User4'], dtype='|S5') 
>>> predictions_user 
array([ 0.45, 0.55, 0.55, 0.435, 0.81666667]) 

Я хотел бы добавить последнюю переменную с именем label_user. Каждое значение будет меткой, ассоциированной с пользователем, с тем же индексом в unq.

Пример вывода:

>>> label_user 
array([0, 1, 1, 0, 0]) 
+0

это делает его более ясным? – pir

ответ

1

Вы можете сделать это путем передачи return_index=True к np.unique. От the docs:

return_index: BOOL, опционального

Если True, то также возвращают индексы ара, которые приводят к уникальному массиву.

Это дает множество индексов в user_data, которые дают уникальные значения в unq. Чтобы получить метки, соответствующие каждое значение в unq, вы просто использовать эти показатели для индекса в labels:

unq, idx, inv_idx, cnt = np.unique(user_data, return_index=True, 
            return_inverse=True, return_counts=True) 

print(unq) 
# ['User0' 'User1' 'User2' 'User3' 'User4'] 

print(label_user[idx]) 
# [0, 1, 1, 0, 0] 

Я переименовал массив «обратные» индексов к inv_idx для того, чтобы отличить его от idx.

Как вычисляя средние значения для каждого уникального имени пользователя, есть также простой способ получить соответствующие этикетки с помощью панд:

import pandas as pd 

df = pd.DataFrame({'user_data':user_data, 'label_user':label_user}) 
print(df.groupby('user_data').label_user.unique()) 
# user_data 
# User0  [0] 
# User1  [1] 
# User2  [1] 
# User3  [0] 
# User4  [0] 
# Name: label_user, dtype: object 
+0

Так что '' предсказания_усец' теперь должны вычисляться вместо 'inv_idx'? – pir

+0

Да. Способ работы этих двух наборов индексов состоит в том, что 'user_data [idx]' дает вам 'unq', тогда как' unq [inv_idx] 'возвращает' user_data'. Чтобы вычислить 'предсказания_user', вам нужен 9-длинный набор индексов, по одному для каждого элемента в' pred'. –

+0

Это похоже на правильное решение, но похоже, что вы должны напечатать 'label [idx]' вместо 'label_user [idx]', который не был определен :) – pir