Вызвать первое второе возвращаемое значение функции, вызванной дважды в цикле for - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть эта функция, которая является частью файла, который я создал для алгоритма кластеризации K-Means.

def assign_to_cluster_mean_centroid(x_in=x, centroids_in=centroids, n_user=n):
'''This function calculates the euclidean distance between each data point and
a cluster centroid. It then allocates each data point to the centroid that it is the
closest to in distance.'''
    distances_arr_re = np.reshape(distance_between(
        centroids_in, x_in[0]), (len(centroids_in), len(x_in[0])))
    datapoint_cen = []
    distances_min = []  # Done if needed
    for value in zip(*distances_arr_re):
        distances_min.append(min(value))
        datapoint_cen.append(np.argmin(value)+1)

    clusters = {}
    for no_user in range(0, n_user):
        clusters[no_user+1] = []

    for d_point, cent in zip(x_in[0], datapoint_cen):
        clusters[cent].append(d_point)

    # Run a for loop and rewrite the centroids
    # with the newly calculated means
    for i, cluster in enumerate(clusters):
        reshaped = np.reshape(clusters[cluster], (len(clusters[cluster]), 2))
        centroids[i][0] = sum(reshaped[0:, 0])/len(reshaped[0:, 0])
        centroids[i][1] = sum(reshaped[0:, 1])/len(reshaped[0:, 1])
    print('Centroids for this iteration are:' + str(centroids))
return datapoint_cen, clusters

Эта функция возвращает два значения: список (datapoint_cen), который содержит все метки, полученные из расстояний, рассчитанных для каждой точки данных до ее ближайшего центроида, а также словарь (кластеры), содержащий каждый кластерс выделенными точками данных для каждого кластера.

Затем у меня есть основной цикл, и я вызываю эту функцию дважды, как показано ниже:

# Create the dataframe for vizualisation
cluster_data = pd.DataFrame({'Birth Rate': x[0][0:, 0],
                             'Life Expectancy': x[0][0:, 1],
                             'label': assign_to_cluster_mean_centroid()[0],
                             'Country': x[1]})

, а также

mean = assign_to_cluster_mean_centroid()[1] 

Моя проблема заключается в том, что при повторном вызове функции при присвоении ее переменной «mean» функция пересчитывает все и возвращает новый набор значений для кластеров. Мне нужно извлечь, при втором вызове функции, кластеры первого вызова функции, чтобы мой алгоритм был точным. Любая помощь будет высоко ценится.

1 Ответ

1 голос
/ 06 ноября 2019

Возможно ли объявить переменную, которая вызывает функцию?

Например,

assigning = assign_to_cluster_mean_centroid()

Затем использовать фрагмент позже? например,

cluster_data = pd.DataFrame({'Birth Rate': x[0][0:, 0],
                             'Life Expectancy': x[0][0:, 1],
                             'label': assigning[0],
                             'Country': x[1]})

И позже:

mean = assigning[1]

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

Кроме того, вы можете распаковать, используя несколько назначений.

например,

label, mean = assign_to_cluster_mean_centroid()

Это означает, что вторая часть уже выполнена, вам просто нужно:

cluster_data = pd.DataFrame({'Birth Rate': x[0][0:, 0],
                             'Life Expectancy': x[0][0:, 1],
                             'label': label,
                             'Country': x[1]})

Надеюсь, это поможет?

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