функция дает неверный вывод - PullRequest
0 голосов
/ 17 апреля 2020

Я столкнулся со странной ошибкой при создании функции. Для школы я должен сделать функцию cos и реализовать ее в другой функции. Все работало, пока мне не пришлось использовать его в другом наборе данных, и я не знаю, почему это не работает. Каждое значение является правильным, кроме того, которое должно иметь 1 как результат, но у меня есть другое значение. Я сделал эту функцию:

def cosine_distance(matrix, id1, id2):



   teller = 0
   noemer_1 = 0
   noemer_2 = 0  
   teller_1 = []
   teller_2 = []
   selected_features = matrix.loc[id2].notna() & matrix.loc[id1].notna()
   if id1 == id2:
      return 1

   if not selected_features.any():
      return np.nan

   features1 = matrix.loc[id1][selected_features]
   features2 = matrix.loc[id2][selected_features]

   for i in features1:
      teller_1.append(i)


   for i in features2:
      teller_2.append(i)

   for i in range(len(features1)):
      teller = teller + teller_1[i]*teller_2[i]

   for x in features1:
      noemer_1 = noemer_1 + x*x


   for x in features2:
      noemer_2 = noemer_2 + x*x    

   noemer = math.sqrt(noemer_1) * math.sqrt(noemer_2)

   if teller == 0 and noemer == 0:
       return np.nan
   return  teller/noemer


def create_similarity_matrix_cosine(matrix):
    similarity_matrix_cosine = pd.DataFrame(0, index=matrix.index, columns=matrix.index, dtype=float)

    for i, row in similarity_matrix_cosine.iterrows():
        for value in row.index:
             similarity_matrix_cosine[i][value]= cosine_distance(matrix, i, value)

    return similarity_matrix_cosine

similarity = create_similarity_matrix_cosine(utility_matrix)
display(similarity)

И это работает, но когда я применяю его к другому набору данных, это дает неправильный вывод. Это набор данных:

userId  123 182 195 204 376 456 542
movieId                         
2571    5.0 5.0 3.0 4.5 3.5 1.5 5.0
2710    1.5 4.5 1.0 5.0 1.5 5.0 0.5
4306    NaN 4.0 3.0 4.0 4.0 NaN 5.0
4444    4.0 3.0 2.0 4.0 4.5 1.0 4.5
5555    3.5 NaN NaN NaN NaN 3.5 NaN

В этой функции я получаю неправильный вывод:

similarity = create_similarity_matrix_cosine(centered_matrix)
def select_neighborhood(similarities, ratings, k):
    list_ = []
    ratings = ratings.sort_values(ascending=False)

    for rating in ratings.index:
        if rating != np.nan:
            list_.append(rating)


    similarities = similarities.loc[list_]
    similarities = similarities[similarities > 0]
    similarities = similarities.drop([similarities.name])

    return similarities

neighborhood = select_neighborhood(similarity[2710], utility_matrix2[195], 10)
display(neighborhood)

Я получаю эту ошибку, может кто-нибудь помочь мне, пожалуйста.

AssertionError: 
Not equal to tolerance rtol=0.1, atol=0

Mismatch: 100%
Max absolute difference: 0.25259068
Max relative difference: 0.25259068
 x: array([0.747409])
 y: array([1.])
...