объект 'numpy.float64' не повторяется - модель контентной фильтрации - PullRequest
5 голосов
/ 08 июля 2019

Я пытаюсь создать модель фильтрации на основе содержимого, но получаю TypeError «объект numpy.float64 не является итеративным».Я новичок в Python и буду очень признателен, если вы дадите мне несколько советов, что мне следует редактировать.

С другим набором данных этот код работает хорошо, но он такой же, в чем может быть проблема?

def get_item_profile(item_id):
    idx = item_ids.index(item_id)
    item_profile = tfidf_matrix[idx:idx+1]
    return item_profile

def get_item_profiles(ids):
    item_profiles_list = [get_item_profile(x) for x in ids]
    item_profiles = scipy.sparse.vstack(item_profiles_list)
    return item_profiles

def build_users_profile(person_id, interactions_indexed_df):
    interactions_person_df = interactions_indexed_df.loc[person_id]
    user_item_profiles = get_item_profiles(interactions_person_df['contentId'])

    user_item_strengths = np.array(interactions_person_df['eventStrength']).reshape(-1,1)
    #Weighted average of item profiles by the interactions strength
    user_item_strengths_weighted_avg = np.sum(user_item_profiles.multiply(user_item_strengths), axis=0) / np.sum(user_item_strengths)
    user_profile_norm = sklearn.preprocessing.normalize(user_item_strengths_weighted_avg)
    return user_profile_norm

def build_users_profiles(): 
    interactions_indexed_df = interactions_full_df[interactions_full_df['contentId'] \
                                                   .isin(articles_df['contentId'])].set_index('personId')
    user_profiles = {}
    for person_id in interactions_indexed_df.index.unique():
        user_profiles[person_id] = build_users_profile(person_id, interactions_indexed_df)
    return user_profiles

Сообщение об ошибке:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-126-1ae36c59638c> in <module>
----> 1 user_profiles = build_users_profiles()

<ipython-input-124-7a1dedc86c38> in build_users_profiles()
     27     user_profiles = {}
     28     for person_id in interactions_indexed_df.index.unique():
---> 29         user_profiles[person_id] = build_users_profile(person_id, interactions_indexed_df)
     30     return user_profiles

<ipython-input-124-7a1dedc86c38> in build_users_profile(person_id, interactions_indexed_df)
     13 def build_users_profile(person_id, interactions_indexed_df):
     14     interactions_person_df = interactions_indexed_df.loc[person_id]
---> 15     user_item_profiles = get_item_profiles(interactions_person_df['contentId'])
     16     print(interactions_person_df['contentId'])
     17 

<ipython-input-124-7a1dedc86c38> in get_item_profiles(ids)
      6 
      7 def get_item_profiles(ids):
----> 8     item_profiles_list = [get_item_profile(x) for x in ids]
      9     item_profiles = scipy.sparse.vstack(item_profiles_list)
     10     return item_profiles

TypeError: 'numpy.float64' object is not iterable

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Запустите следующий код, чтобы увидеть результаты:

import numpy as np
#b is iterable object
b = np.array([1,2],dtype=np.float64)
print([i for i in b])
#a is not iterable object
a = np.array([1,2],dtype=np.float64)[0]
print([i for i in a])
0 голосов
/ 08 июля 2019

Если вы передадите число как ids, а не какая-то повторяемая последовательность чисел, тогда вы вызовете такую ​​ошибку типа.

Организовать, чтобы этот набор данных содержал несколько идентификаторов, похож на другие ваши наборы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...