Я столкнулся со странной ошибкой при создании функции. Для школы я должен сделать функцию 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.])