Операнды не могут быть переданы с формами (19,) (0,) - KNN - PullRequest
0 голосов
/ 09 ноября 2019

Я работаю над тем, как использовать KNN для прогнозирования рейтинга фильма. Я использую видео и книгу, чтобы научить себя, как это сделать

Я попытался запустить код, который нашел в книге, но он выдал сообщение об ошибке. Я погуглил сообщение об ошибке, чтобы понять его и исправить свою проблему, но не думаю, что знаю, как адаптировать решения к моей проблеме.

import numpy as np

import pandas as pd

r_cols = ['user_id', 'movie_id', 'rating']

ratings = pd.read_csv('C:/Users/dell/Downloads/DataScience/DataScience-Python3/ml-100k/u.data', sep='\t', engine='python', names=r_cols, usecols=range(3))  # please enter your file path here. The file is u.data

print(ratings.head())   

movieProperties = ratings.groupby('movie_id').agg({'rating': [np.size, np.mean]})

print(movieProperties.head())

movieNumRatings = pd.DataFrame(movieProperties['rating']['size'])

movieNormalizedNumRatings = movieNumRatings.apply(lambda x: (x - np.min(x)) / (np.max(x) - np.min(x)))

print(movieNormalizedNumRatings.head())

movieDict = {}

with open('C:/Users/dell/Downloads/DataScience/DataScience-Python3/ml-100k/u.item') as f:     # The file is u.item

    temp = ''

    for line in f:

        fields = line.rstrip('\n').split('|')

        movieID = int(fields[0])

        name = fields[1]

        genres = fields[5:25]

        genres = map(int, genres)

        movieDict[movieID] = (name, genres, movieNormalizedNumRatings.loc[movieID].get('size'), movieProperties.loc[movieID].rating.get('mean'))

print(movieDict[1])

from scipy import spatial

def ComputeDistance(a, b):

    genresA = np.array(list(a[1]))

    genresB = np.array(list(b[1]))

    genreDistance = spatial.distance.cosine(genresA, genresB)

    popularityA = np.array(a[2])

    popularityB = np.array(b[2])

    popularityDistance = abs(popularityA - popularityB)

    return genreDistance + popularityDistance 

print(ComputeDistance(movieDict[2], movieDict[4])) 

import operator

def getNeighbors(movieID, K):

    distances = []

    for movie in movieDict:

        if (movie != movieID):

            dist = ComputeDistance(movieDict[movieID], movieDict[movie])

            distances.append((movie, dist))

    distances.sort(key=operator.itemgetter(1))

    neighbors = []

    for x in range(K):

        neighbors.append(distance[x][0])

    return neighbors

K = 10

avgRating = 0

neighbors = getNeighbors(1, K)

Я получил это сообщение об ошибке из PowerShell:

Трассировка (последний последний вызов):

neighbors = getNeighbors(1, K)

dist = ComputeDistance(movieDict[movieID], movieDict[movie])

genreDistance = spatial.distance.cosine(genresA, genresB)

return correlation(u, v, w=w, centered=False)

uv = np.average(u*v, weights=w)

ValueError: operands could not be broadcast together with shape (19,)(0,)

При попытке отладки проблемы с терминала ipython я получил это сообщение:

c:\programdata\anaconda3\lib\site-packages\scipy\spatial\distance.py(695)correlation()

     693        u = u - umu

     694        v = v - vmu

---> 695        uv = np.average(u*v, weights=w)

     696        uu = np.average(np.square(u), weights=w)

     697        vv = np.average(np.square(v), weights=w)


**Note**: The code ran fine and produced results up until *print(Cprint(ComputeDistance(movieDict[2], movieDict[4]))*

My guess is the problem is with this part of the code: 


import operator
def getNeighbors(movieID, K):
    distances = []
    for movie in movieDict:
        if (movie != movieID):
            dist = ComputeDistance(movieDict[movieID], movieDict[movie])
            distances.append((movie, dist))
    distances.sort(key=operator.itemgetter(1))
    neighbors = []
    for x in range(K):
        neighbors.append(distance[x][0])
    return neighbors

K = 10
avgRating = 0
neighbors = getNeighbors(1, K) 


The code can be found in this link: https://hendra-herviawan.github.io/Movie-Recommendation-based-on-KNN-K-Nearest-Neighbors.html

1 Ответ

0 голосов
/ 09 ноября 2019

Ошибка «операнды не могут быть переданы вместе с shape (x,) (y,)» обычно возникает, когда вы пытаетесь выполнить операцию между двумя массивами, которые должны иметь одинаковую форму, но они этого не делают. В вашем случае вы пытаетесь взять средневзвешенное значение между двумя массивами u и v. Массивы u и v не имеют длины.

Я видел, что вы анализируете список фильмов, разбивая строки с помощью "|"символ, а затем сохранить эти результаты в словаре. Вероятно, этот файл или его разделение с "|"возвращают разные результаты.

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

...