Как рассчитать категорию полезности - PullRequest
0 голосов
/ 02 декабря 2019

В настоящее время я пытаюсь реализовать Category Utility (как определено здесь ) в Python. Я пытаюсь использовать Панд для достижения этой цели. В настоящее время у меня есть черновик кода, но я уверен, что это неправильно. Я думаю, что это неправильно, в частности, в коде, который имеет дело с циклической обработкой кластеров и вычислением inner_sum, поскольку утилита категорий требует прохождения всех возможных значений для каждого атрибута. Кто-нибудь сможет помочь мне выяснить, как улучшить этот черновик так, чтобы он правильно вычислял утилиту категории для заданных кластеров?

Вот код:

import pandas as pd
from typing import List

def probability(df: pd.DataFrame, clause: str) -> pd.DataFrame:
    """
    Gets the probabilities of the values within the given data frame
    of the provided clause
    """
    return df.groupby(clause).size().div(len(df))


def conditional_probability(df: pd.DataFrame, clause: str, given: str) -> pd.DataFrame:
    """
    Gets the conditional probability of the values within the provided data
    frame of the provided clause assuming that the given is true.
    """
    base_probabilities: pd.DataFrame = probability(df, clause=given)
    return df.groupby([clause, given]).size().div(len(df))
        .div(base_probabilities, axis=0, level=given)

def category_utility(clusters: pd.DataFrame) -> float:
    # k is the number of clusters.
    k: int = len(clusters)
    # probabilities of all clusters. To be used to get P(C_l)
    probs_of_clusters: pd.DataFrame = probability(clusters, 'clusters')
    # probabilities of all attributes being any possible value.
    # To be used to get P(a_i = v_ij)
    probs_of_attr_vals: pd.DataFrame = probability(clusters, 'attributes')
    # Probabilities of all attributes being any possible value given the cluster they're in.
    # To be used to get P(a_i = v_ij | C_l) 
    cond_prob_of_attr_vals: pd.DataFrame = conditional_probability(clusters, clause='attributes', given='clusters')

    tracked_cu: List[float] = []

    for cluster in clusters['clusters']:
        # The probability of the current cluster.
        # P(C_l)
        prob_of_curr_cluster: float = probs_of_clusters[cluster]
        # The summation of the square difference between an attribute being in a cluster and just overall existing in the data.
        # E (P(a_i = v_ij | C_l) ^ 2 - P(a_i = v_ij) ^ 2)
        inner_sum: float = sum([cond_prob_of_attr_vals[attr] ** 2 - probs_of_attr_vals[attr] for attr in clusters['attributes']])

        tracked_cu += inner_sum * prob_of_curr_cluster
    return sum(tracked_cu) / k

Любая помощь справильное выполнение этого будет оценено.

...