示例#1
0
 def __init__(self, provider=None, is_plot=True):
   if provider is None:
     self._provider = DataProvider()
     self._provider.do()
   else:
     self._provider = provider
   self._is_plot = is_plot
示例#2
0
def trinaryReadsDF(csv_file=None, df_sample=None,
    csv_dir=cn.SAMPLES_DIR, is_display_errors=True):
  """
  Creates trinary values for read counts w.r.t. data provider.
  (a) adjusting for gene length, (b) library size,
  (c) log2, (d) ratio w.r.t. T0.
  Data may come from an existing dataframe or a CSV file.
  :param str csv_file: File in "samples" directory.
      columns are: "GENE_ID", instance ids
  :param pd.DataFrame df_sample: columns are genes,
      index are instances, values are raw readcounts
  :param str csv_dir: directory where csv file is found
  :return pd.DataFrame: columns are genes, 
      indexes are instances, trinary values
  At least one of df_sample and csv_file must be non-null
  """
  provider = DataProvider(is_display_errors=is_display_errors)
  provider.do()
  if df_sample is None:
    path = os.path.join(csv_dir, csv_file)
    df_sample = pd.read_csv(path)
    df_sample.index = df_sample['GENE_ID']
    del df_sample['GENE_ID']
  #
  df_normalized = provider.normalizeReadsDF(df_sample)
  # Compute trinary values relative to original reads
  df_ref = sum(provider.dfs_adjusted_read_count)  \
      / len(provider.dfs_adjusted_read_count)  # Mean values
  ser_ref = df_ref[cn.REF_TIME]
  return calcTrinaryComparison(df_normalized, ser_ref=ser_ref)
示例#3
0
 def __init__(self, is_display_errors=True, is_averaged=True):
     """
 :param bool is_display_errors: Shows errors encountered
 :param bool is_averaged: Use averaged read counts
 Public instance variables:
   df_X are normalized read counts
   states_dict - mapping of literal to numeric values of state
   ser_y - numeric value of state corresponding to each row in df_X
 """
     self._is_display_errors = is_display_errors
     self.provider = DataProvider(is_display_errors=self._is_display_errors)
     self.provider.do()
     self.df_X = self.provider.df_normalized.T
     self.df_X = self.df_X.drop(index="T0")
     self.features = self.df_X.columns.tolist()
     self.df_X.columns = range(len(self.features))
     # Create class information
     ser_y = self.provider.df_stage_matrix[cn.STAGE_NAME]
     ser_y = ser_y.drop(index="T0")
     ser_y = ser_y.copy()
     ser_y[ser_y == 'Normoxia'] = 'Resuscitation'
     # Create converter from state name to numeric index
     states = ser_y.unique()
     self.state_dict = {k: v for v, k in enumerate(states)}
     self.ser_y = ser_y.apply(lambda k: self.state_dict[k])
示例#4
0
def aggregateGenes(df=None, provider=None):
  """
  Combines genes that are perfectly correlated in time for trinary
  values.
  :param DataFrame df: dataframe to transform
  :param DataProvider provider: uses df_normalized
  :return pd.DataFrame: names are combined for aggregated
      genes; calculates trinary values
  """
  if df is None:
    if provider is None:
      provider = DataProvider()
      provider.do()
    df = provider.df_normalized
  df_trinary = makeTrinaryData(df, is_include_nan=False)
  dfg = df_trinary.groupby(df_trinary.columns.tolist())
  groups = dfg.groups
  data = {}
  for key, genes in groups.items():
    label = "--".join(genes)
    data[label] = list(key)
  df = pd.DataFrame(data)
  df_result = df.T
  df_result.columns = df_trinary.columns
  return df_result
示例#5
0
 def testTrinaryReadsDF2(self):
   return
   # Checks that trinary values computed directly from reads
   # are the same as those of normalized samples.
   # Get raw value of read counts
   provider = DataProvider()
   provider.do()
   #
   def calcTrinaryTimeSample(time_index):
       """
       Calculates the trinary value of a time sample
       :param str time_index: name of time value
       """
       int_index = int(time_index[1:])
       df0 = provider.dfs_read_count[0]
       num = len(provider.dfs_read_count)
       ser = pd.Series(np.repeat(0, len(df0.index)), index=df0.index)
       for idx in range(num):
           ser += provider.dfs_read_count[idx][int_index]
       df = pd.DataFrame(ser/num)
       df_result = transform_data.trinaryReadsDF(df_sample=df)
       return df_result.T
   #
   data = TrinaryData()
   data.df_X.columns = data.features
   for time_index in data.df_X.index:
     df_result = calcTrinaryTimeSample(time_index)
     import pdb; pdb.set_trace()
示例#6
0
 def testAggregateGenes(self):
   if IGNORE_TEST:
     return
   provider = DataProvider()
   provider.do()
   df = transform_data.aggregateGenes(provider=provider)
   self.assertTrue(helpers.isValidDataFrame(df,
       provider.df_normalized.columns))
示例#7
0
def getProvider(provider):
    """
  Returns a provider
  """
    if provider is None:
        provider = DataProvider()
        provider.do()
    return provider
示例#8
0
 def __init__(self, df_trinary=None):
     """
 :param pd.DataFrame df: trinary valued DF (has values -1, 0, 1)
 """
     if df_trinary is None:
         provider = DataProvider()
         provider.do()
         df_trinary = transform_data.makeTrinaryData(is_include_nan=False)
     self.df_trinary = df_trinary
     self.df_group = None  # Dataframe describing groups
     self.df_gene_group = None  # Genes by group
示例#9
0
 def __init__(self, term_column=cn.GO_TERM, is_plot=True, **kwargs):
     """
 :param str term_column: column in go_terms to use for text
 :param dict **kwargs: arguments to DataGrouper
 """
     self._is_plot = is_plot
     self.provider = DataProvider()
     self.provider.do()
     self.grouper = DataGrouper(**kwargs)
     self.grouper.do(min_size=1)
     self.df_matrix = self._makeMatrix(term_column)
     self.df_gene_term = self._makeGeneTerm()
def _getData():
  provider = DataProvider()
  provider.do()
  trinary = TrinaryData(is_averaged=False,
      is_dropT1=False)
  if IS_ONLY_TFS:
    columns = set(trinary.df_X.columns).intersection(
        provider.tfs)
  else:
    columns = trinary.df_X.columns
  columns = list(columns)
  return trinary.df_X[columns], trinary.ser_y
示例#11
0
class CVPlotter():

  def __init__(self, provider=None, is_plot=True):
    if provider is None:
      self._provider = DataProvider()
      self._provider.do()
    else:
      self._provider = provider
    self._is_plot = is_plot

  def heatMap(self, min_cv=0):
    """
    Plots a heatmap of the coefficient of variations.
    :param pd.DataFrame df_cv: CVs
    :param float min_cv: minimum CV to consider
    """
    plt.figure(figsize=(16, 10))
    df = self._provider.df_cv
    # Rename columns to their hours
    ax = plt.gca()
    ax.set_xticks(np.arange(len(df.columns))+0.5)
    ax.set_xticklabels(df.columns)
    df = df.applymap(lambda v: v if v >= min_cv else np.nan)
    heatmap = plt.pcolor(df, cmap='jet')
    plt.colorbar(heatmap)
    plt.xlabel("times")
    plt.ylabel("gene")
    plt.title("Coefficient of Variation > %d percent" % min_cv)
    if self._is_plot:
      plt.show()

  def readsAndDO(self):
    """
    Plots the following lines for the hours of the experiments:
      Average CV of genes
      CV of dissolved oxygen (DO)
      Avg dissolved oxygen
    """
    hours = self._provider.df_hypoxia[cn.HOURS]
    means = self._provider.df_hypoxia[cn.MEAN]
    error_bars = [2*s for s in self._provider.df_hypoxia[cn.STD]]
    plt.errorbar(hours, means, yerr=error_bars, marker="o")
    ax = plt.gca()
    # Plot CVs of genes
    ser = self._provider.df_cv.mean()  # Average over geans
    ax.plot(hours, ser.values, linestyle='dashed', marker="o",
        color='r')
    plt.xlabel("hours")
    plt.ylabel("DO/CV")
    plt.legend(["CV for read counts", "DO +/- 2 std"])
    if self._is_plot:
      plt.show()
示例#12
0
    def __init__(self, is_averaged=True, is_regulator=False, **kwargs):
        """
    :param bool is_averaged: Use averaged read counts
    :param bool is_regulator: use regulators for TRN
    :param dict kwargs: options passed to DataProvider

    Public instance variables:
      df_X are normalized read counts
          instances are either times (begin with T) for stage (S)
      ser_y - numeric value of state corresponding to each row in df_X
      self.state_dct:
          key: state name
          value: state index
      self.features: list of names of gene
    """
        self.provider = DataProvider(**kwargs)
        self.provider.do()
        if is_averaged:
            self.df_X = self.provider.df_normalized.T
        else:
            # Use the adjusted values for each replication
            dfs = [
                df.copy()
                for df in self.provider.dfs_adjusted_read_count_wrtT0_log2
            ]
            self.df_X = pd.concat([df.T for df in dfs])
        drop_indices = self._getDropIndices(self.df_X.index)
        self.df_X = self.df_X.drop(drop_indices)
        if is_regulator:
            subsetToRegulators(self.df_X)
        self.features = self.df_X.columns.tolist()
        # Create class information
        ser_y = self.provider.df_stage_matrix[cn.STAGE_NAME]
        if not is_averaged:
            # Replica information has a specical time format
            num_repl = len(self.provider.dfs_read_count)
            sers = []
            for idx in range(num_repl):
                new_ser_y = ser_y.copy()
                new_ser_y.index = self.provider.makeTimes(suffix=idx)
                sers.append(new_ser_y)
            ser_y = pd.concat(sers)
        states = list(cn.STATE_NAMES)
        ser_y = ser_y.drop(self._getDropIndices(ser_y.index))
        if len(ser_y[ser_y == cn.STATE_NORMOXIA])  \
            <= MIN_NUM_NORMOXIA:
            ser_y[ser_y == cn.STATE_NORMOXIA] = cn.STATE_RESCUSCITATION
            states.remove("Normoxia")
        # Create converter from state name to numeric index
        self.state_dct = {k: v for v, k in enumerate(states)}
        self.ser_y = ser_y.apply(lambda k: self.state_dct[k])
示例#13
0
class TestFunctions(unittest.TestCase):
    def setUp(self):
        self.trinary = TrinaryData()
        self.provider = DataProvider()
        self.provider.do()

    def testCountTerms(self):
        if IGNORE_TEST:
            return
        TERM = "DNA replication"
        EXPECTED_COUNT = 2

        def test(terms, expected_count, fset=None):
            df_gene = self.provider.df_go_terms
            if fset is None:
                feature_set = FeatureSet(df_gene[xcn.GENE_ID][1:3])
                fset = FeatureSet(df_gene[xcn.GENE_ID][1:3])
            count = util_classifier.countTerms(fset, terms)
            self.assertEqual(count, expected_count)

        #
        test([TERM], EXPECTED_COUNT)
        test([TERM, TERM], 2 * EXPECTED_COUNT)
        test(["DUMMY"], 0)
        #
        fset = FeatureSet(['Rv0981--Rv1332--Rv1828'])
        test(["DUMMY"], 0, fset=fset)

    def testCountTerms2(self):
        if IGNORE_TEST:
            return
        TERMS = ["a"]
        fset = FeatureSet(["Rv2009"])
        count1 = util_classifier.countTerms(fset,
                                            TERMS,
                                            is_include_module=False)
        count2 = util_classifier.countTerms(fset,
                                            TERMS,
                                            is_include_module=True)
        self.assertGreater(count2, count1)

    def testExtractAggregatedGene(self):
        if IGNORE_TEST:
            return
        GENES = ['Rv0981', 'Rv1332', 'Rv1828']
        AGGREGATED_GENE = xcn.GENE_SEPARATOR.join(GENES)
        genes = util_classifier.extractAggregatedGene(AGGREGATED_GENE)
        diff = set(GENES).symmetric_difference(genes)
        self.assertEqual(len(diff), 0)
 def testTrinaryReadsDF1(self):
     if IGNORE_TEST:
         return
     provider = DataProvider()
     provider.do()
     df = provider.dfs_read_count[0]
     df_result = transform_data.trinaryReadsDF(df_sample=df)
     # See if number of "-1" is excessive
     dff = df_result + df_result.applymap(lambda v: -np.abs(v))
     frac_minus1 = -dff.sum().sum()  \
         /(2*len(df_result)*len(df_result.columns))
     self.assertLess(frac_minus1, 0.25)
     # Smoke tests for csv
     df_result = transform_data.trinaryReadsDF(
         csv_file="AM_MDM_Mtb_transcripts_DEseq.csv",
         is_display_errors=False)
def _getData(state):
  """
  Obtains data for a binary classifier for the class.
  :param int state: state for which classification is done
  :param pd.DataFrame, pd.Series:
  """
  provider = DataProvider()
  provider.do()
  trinary = TrinaryData(is_averaged=False,
      is_dropT1=False)
  columns = set(trinary.df_X.columns).intersection(
      provider.tfs)
  columns = list(columns)
  ser_y = trinary.ser_y.apply(lambda v:
    1 if v == state else 0)
  return trinary.df_X[columns], ser_y
示例#16
0
 def __init__(self, persister=PERSISTER):
     if persister.isExist():
         shared_data = persister.get()
         for key in shared_data.__dict__.keys():
             self.__setattr__(key, shared_data.__getattribute__(key))
     else:
         self.provider = DataProvider()
         self.trinary = trinary_data.TrinaryData(is_averaged=False,
                                                 is_dropT1=False,
                                                 is_regulator=True)
         self.df_X = self.trinary.df_X
         self.ser_y = self.trinary.ser_y
         self.states = self.ser_y.unique()
         data_dir = os.path.join(cn.DATA_DIR, DIRECTORY)
         data_path_pat = os.path.join(data_dir, "%d")
         analyzer_dct = fa.deserialize(
             {s: data_path_pat % s
              for s in self.states})
         analyzers = analyzer_dct.values()
         self.collection_dct = {
             s: fsc.FeatureSetCollection.deserialize(data_path_pat % s)
             for s in self.states
         }
         _ = [c.df_fv for c in self.collection_dct.values()]
         persister.set(self)
示例#17
0
class TestTermAnalyzer(unittest.TestCase):

  def setUp(self):
    self.provider = DataProvider()
    self.provider.do()
    self.analyzer = term_analyzer.TermAnalyzer(
        self.provider.df_ec_terms, is_plot=IS_PLOT)

  def testConstructor(self):
    if IGNORE_TEST:
      return
    self.assertTrue(helpers.isValidDataFrame(self.analyzer.df_term,
        self.analyzer.df_term.columns))

  def testPlotTermHeatmap(self):
    if IGNORE_TEST:
      return
    self.analyzer.plotTermHeatmap(is_plot=IS_PLOT)
示例#18
0
def makeTrinaryData(df=None, min_abs=1.0, is_include_nan=True):
    """
  Thresholds data based on its absolute magnitude.
  Values are assigned as -1, 0, 1
  :param pd.DataFrame df: default is provider.df_normalized
    values are in log2 units
  :param float min_abs: minimal absolute value to threshold.
  :param bool is_include_nan: Include nan values; else set to 0
  :return pd.DataFrame: same index and columns as df
  """
    if df is None:
        provider = DataProvider()
        provider.do()
        df = provider.df_normalized
    df_result = df.copy()
    df_result = df_result.applymap(lambda v: 0 if np.abs(v) < min_abs else -1
                                   if v < 0 else 1)
    if is_include_nan:
        df_result = df_result.applymap(lambda v: np.nan if v == 0 else v)
    return df_result
示例#19
0
def countTerms(fset, terms, is_include_module=True):
    """ 
  Counts the occurrences of terms in the GO terms
  of genes in the FeatureSet.

  Parameters
  ----------
  fset: FeatureSet
  terms: list-str
  is_include_module: bool
      consider all genes in modules activated by a
      gene in fset

  Returns
  -------
  int
  """
    provider = DataProvider()
    provider.do()
    # Extract the genes
    genes = []
    [genes.extend(extractAggregatedGene(c)) for c in fset.list]
    if is_include_module:
        new_genes = []
        tfs = list(set(provider.df_trn_unsigned[xcn.TF].tolist()))
        for gene in genes:
            if gene in tfs:
                sel = provider.df_trn_unsigned[xcn.TF] == gene
                df = provider.df_trn_unsigned[sel]
                new_genes.extend(df[xcn.GENE_ID].tolist())
        genes.extend(new_genes)
        genes = list(set(genes))
    # Compile the string of go terms for the genes
    df = provider.df_go_terms
    indices = [df[df[xcn.GENE_ID] == g].index.tolist() for g in genes]
    indices = [t for l in indices for t in l]
    go_terms = df.loc[indices, xcn.GO_TERM].to_list()
    go_str = "****".join(go_terms)
    count = sum([go_str.count(t) for t in terms])
    return count
示例#20
0
文件: aufg06.py 项目: MaxSac/PatRec
def aufg06():
    #
    # Nun sollen die Daten des MNIST-Datensatzes mit den vorher erstellten
    # Klassifikatoren klassifiziert werden. Trainieren Sie dazu jeweils mit den
    # Trainigsdaten einen Klassifikator und berechnen Sie den sich ergebenden
    # Klassifikationsfehler auf dem Testdatensatz. Variieren Sie die
    # Parametrisierung der Klassifikatoren,
    # um einen moeglichst geringen Klassifikationsfehler zu erreichen.
    #
    # Trainieren Sie einen Mischverteilungsklassifikator fuer verschiedene mit
    # PCA dimensionsreduzierte Versionen des MNIST-Datensatzes und vergleichen
    # Sie die erzielten Ergebnisse.
    #
    # Trainieren Sie einen k-NN-Klassifikator fuer verschiedene mit PCA
    # dimensionsreduzierte Versionen des MNIST-Datensatzes und vergleichen Sie
    # die erzielten Ergebnisse.

    train_data_provider = DataProvider(DataProvider.MNIST_TRAIN_PCA)
    test_data_provider = DataProvider(DataProvider.MNIST_TEST_PCA)
    train_data, train_labels = train_data_provider.get_dataset_and_labels()
    test_data, test_labels_gt = test_data_provider.get_dataset_and_labels()

    raise NotImplementedError('Implement me')
示例#21
0
class TermMatrix(object):
    """
  The core dataframe is the term matrix, self.df_matrix. Its columns
  are terms; the rows are groups of correlated genes. A group is
  a tuple of trinary values indicating when that terms is expressed.
  """
    def __init__(self, term_column=cn.GO_TERM, is_plot=True, **kwargs):
        """
    :param str term_column: column in go_terms to use for text
    :param dict **kwargs: arguments to DataGrouper
    """
        self._is_plot = is_plot
        self.provider = DataProvider()
        self.provider.do()
        self.grouper = DataGrouper(**kwargs)
        self.grouper.do(min_size=1)
        self.df_matrix = self._makeMatrix(term_column)
        self.df_gene_term = self._makeGeneTerm()
        import pdb
        pdb.set_trace()

    def _makeTermGroup(self, term_column=cn.GO_TERM):
        """
    :param str term_column: column in go_terms to use for text
    :return pd.DataFrame:
      index - group (time intervals with trinary values)
      column - Term
    """
        df = self.grouper.df_gene_group.merge(self.provider.df_go_terms,
                                              left_index=True,
                                              right_index=True,
                                              how='inner')
        if term_column == cn.INDEX:
            df_term = df[[cn.GROUP]].copy()
            df_term[term_column] = df.index
        else:
            df_term = df[[cn.GROUP, term_column]].copy()
        df_term = df_term.set_index(cn.GROUP)
        return df_term

    def _makeMatrix(self, term_column=cn.GO_TERM):
        """
    :param str term_column: column in go_terms to use for text
    :return pd.DataFrame: matrix with the terms
    """
        df_term = self._makeTermGroup(term_column=term_column)
        df_result = util_text.makeTermMatrix(df_term[term_column])
        return df_result

    def _makeGeneTerm(self):
        """
    Finds the genes and terms that co-occur at the same times.
    :return pd.DataFrame:
        cn.GROUP - trinary values for genes at times
        cn.TERM - list of GO terms
        cn.GENE_D - list of genes
        cn.CNT_TERM - count of GO terms
        cn.CNT_GENE - count of genes
        cn.CNT_REGULATED - count of times up- down-regulated
    """
        def makeGroupedDF(df):
            df = df.reset_index()
            return df.groupby(cn.GROUP)

        def extract(df, key, col):
            sel = df.index == key
            result = df[sel][col].values.tolist()
            return result

        #
        df_term = self._makeTermGroup()
        df_gene = self.grouper.df_gene_group
        df_gene = df_gene.reset_index()
        df_gene = df_gene.set_index(cn.GROUP)
        dfg_term = makeGroupedDF(df_term)
        dfg_gene = makeGroupedDF(self.grouper.df_gene_group)
        # Find the keys in common
        keys_term = [k for k in dfg_term.groups]
        keys_gene = [k for k in dfg_gene.groups]
        keys_common = set(keys_term).intersection(keys_gene)
        dict_df = {cn.GROUP: [], cn.TERM: [], cn.GENE_ID: []}
        for key in keys_common:
            dict_df[cn.GROUP].append(key)
            dict_df[cn.TERM].append(extract(df_term, key, cn.GO_TERM))
            dict_df[cn.GENE_ID].append(extract(df_gene, key, cn.GENE_ID))
        df_result = pd.DataFrame(dict_df)
        df_result[cn.CNT_GENE] = [len(g) for g in df_result[cn.GENE_ID]]
        df_result[cn.CNT_TERM] = [len(t) for t in df_result[cn.TERM]]
        df_result[cn.CNT_REGULATED] =   \
            [sum([np.abs(x) for x in g]) for g in df_result[cn.GROUP]]
        return df_result

    def makeAggregationMatrix(self, predicates):
        """
    Creates a matrix with columns the same as df_matrix
    and row i that is the summation of the values in rows
    that satisfy predicate i.
    :param list-BooleanFunc predicates: predicate on group tuples
    """
        columns = self.df_matrix.columns
        column_values = {c.strip(): [] for c in columns}
        for pos, predicate in enumerate(predicates):
            row = np.repeat(0.0, len(columns))
            row = row.reshape(1, len(columns))
            # TODO: Fix predicates
            if False:
                for group in self.df_matrix.index:
                    if predicate(group):
                        values = np.array(self.df_matrix.loc[[group], :])
                        row += values
            for group in self.df_matrix.index:
                if group[pos] == 1:
                    values = np.array(self.df_matrix.loc[[group], :])
                    row += values
            row = row.reshape(len(columns))
            # Add the row for this predicate
            for idx, col in enumerate(columns):
                column_values[col].append(row[idx])
        return pd.DataFrame(column_values)

    # TODO: Fix use of predicates
    def plotAggregation(self, predicates, min_val=0, is_include_ylabels=True):
        df = self.makeAggregationMatrix(predicates)
        df = df.applymap(lambda v: 0 if v < min_val else v)
        df = df.applymap(lambda v: np.nan if np.isclose(v, 0) else v)
        # Drop columns that are all nans
        for col in df.columns:
            if all([np.isnan(v) for v in df[col]]):
                del df[col]
        # Construct the plot
        plt.subplot(1, 2, 2)
        heatmap = plt.pcolor(df.transpose(), cmap='jet')
        if is_include_ylabels:
            ax = plt.gca()
            ax.set_yticks(np.arange(len(df.columns)) + 0.5)
            ax.set_yticklabels(df.columns, fontsize=8)
        plt.title("Term Counts")
        plt.colorbar(heatmap)
        plt.show()

    def makeTimeAggregationMatrix(self, is_up_regulated=True):
        """
    Creates a matrix with columns the same as df_matrix
    and row i that is the summation of the values in rows
    that satisfy predicate i.
    :param bool is_up_regulated:
    """
        if is_up_regulated:
            direction = 1
        else:
            direction = -1
        columns = self.df_matrix.columns
        column_values = {c.strip(): [] for c in columns}
        for time in range(cn.NUM_TIMES):
            row = np.repeat(0.0, len(columns))
            row = row.reshape(1, len(columns))
            for group in self.df_matrix.index:
                if group[time] == direction:
                    values = np.array(self.df_matrix.loc[[group], :])
                    row += values
            row = row.reshape(len(columns))
            # Add the row for this predicate
            for idx, col in enumerate(columns):
                column_values[col].append(row[idx])
        return pd.DataFrame(column_values)

    def calcClusters(self, max_distance=1, is_up_regulated=True):
        """
    Calculates log significance levels and clusters.
    :param float max_distance: maximum distance between clusters,
        otherwise merged
    :return pd.DataFrame, ndarray, pd.Series:
       df_log - log of significance level
       row_linkage - linkage matrix
           See https://stackoverflow.com/questions/9838861/scipy-linkage-format
       ser_cluster - cn.GROUP (indexed by term)
    """
        df = self.makeTimeAggregationMatrix(is_up_regulated=is_up_regulated)
        # Remove rows with zero variance
        df_filtered = util_statistics.filterZeroVarianceRows(df.T)
        # Compute significance levels
        df_log = util_statistics.calcLogSL(df_filtered, round_decimal=3)
        df_log = df_log.applymap(lambda v: HIGH_SL if np.isnan(v) else v)
        # Compute the clusters
        log_arrays = np.asarray(df_log)
        row_linkage = linkage(distance.pdist(log_arrays), method='average')
        ser_cluster = pd.Series(
            fcluster(row_linkage, 0.1, criterion="distance"))
        ser_cluster.index = df_log.index
        #
        return df_log, row_linkage, ser_cluster

    # Include state transitions
    # Note how clusters relate to state observations
    def plotTimeAggregation(self, is_up_regulated=True):
        """
    Plots aggregation of groups over time.
    :param bool is_include_ylabels:
    :param bool is_up_regulated:
    """
        df_log, row_linkage, ser_cluster =  \
            self.calcClusters(is_up_regulated=is_up_regulated)
        # Heatmap
        cg = sns.clustermap(df_log,
                            row_linkage=row_linkage,
                            col_cluster=False,
                            cbar_kws={"ticks": [0, 5]},
                            cmap="Blues")
        # Construct a cluster map
        #cg = sns.clustermap(df_log, col_cluster=False,
        #    cbar_kws={"ticks":[0,5]}, cmap="Blues")
        # Set the labels
        cg.ax_heatmap.set_xlabel("Time")
        if is_up_regulated:
            direction = "Up"
        else:
            direction = "Down"
        title = "-log10 zscores of %s-regulated term counts" % (direction)
        cg.ax_heatmap.set_title(title)
        xticks = cg.ax_heatmap.get_xticks() - 0.5  # Correct tick position
        cg.ax_heatmap.set_xticks(xticks)
        cg.ax_heatmap.set_yticks([])
        cg.ax_heatmap.set_yticklabels([])
        # Add the state transitions
        util_plots.plotStateTransitions(ymax=len(df_log),
                                        ax=cg.ax_heatmap,
                                        is_plot=False)
        #
        if self._is_plot:
            plt.show()
示例#22
0
文件: aufg02.py 项目: MaxSac/PatRec
def aufg02():
    # In dieser Aufgabe soll ein Bayes'scher Normalverteilungs-Klassifikator
    # mit drei Dichten realisiert werden.
    #
    # Zunaechst sollen Mittelwert und Kovarianzmatrix der drei Klassen geschaetzt
    # und visualisiert werden:
    train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN)
    train_data, train_labels = train_data_provider.get_dataset_and_labels()

    #
    # Extrahieren Sie die Klassen-Labels aus dem Trainingsdatensatz und speichern
    # Sie sie in der lokalen Variablen labels
    #
    # Nuetzliche Funktionen:
    # https://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html

    labels = np.unique(train_labels)

    # raise NotImplementedError('Implement me')

    mean_list = []
    cov_list = []
    for label in labels:
        #
        # Berechnen Sie Mittelwert und Kovarianz der drei Klassen durch
        # Matrixoperationen in NumPy.
        # Speichern Sie fuer jeden Schleifendurchlauf den Mittelwert in der
        # lokalen Variablen mean und die Kovarianzmatrix in der lokalen Variablen
        # cov. Benutzen Sie zur Schaetzung die korrigierte Kovarianzmatrix:
        # https://de.wikipedia.org/wiki/Stichprobenkovarianz#Korrigierte_Stichprobenkovarianz

        class_data = train_data[train_labels == label]
        mean = np.mean(class_data, axis=0)
        cov = np.cov(class_data, rowvar=0)

        # raise NotImplementedError('Implement me')

        # -----------------------nachfragen---------------------------
        np.testing.assert_almost_equal(actual=mean,
                                       desired=np.mean(class_data, axis=0),
                                       err_msg='Der Mittelwert ist falsch')
        np.testing.assert_almost_equal(
            actual=cov,
            desired=np.cov(class_data, rowvar=0),
            err_msg='Die Kovarianzmatrix ist falsch')

        mean_list.append(mean)
        cov_list.append(cov)

    # Visualisieren Sie die Datenpunkte der drei Klassen, sowie die geschaetzen
    # Mittelwerte und Kovarianzmatrizen durch eine Normalverteilung.
    # Zur Visualisierung der Normalverteilungen: visualization.plot_norm_dist_ellipse

    fig = plt.figure()
    ax = fig.add_subplot(111)
    colors = ['#FF0000', '#00FF00', '#0000FF']
    for label, color in zip(labels, colors):
        class_data = train_data[train_labels == label]
        ax.scatter(class_data[:, 0],
                   class_data[:, 1],
                   c=color,
                   edgecolor=(0, 0, 0))
    plot_norm_dist_ellipse(ax, mean_list, cov_list, colors)

    plt.show()

    # raise NotImplementedError('Implement me')

    # Implementieren sie einen Bayes'schen Normalverteilungs-Klassifikator (ohne
    # Rueckweisung), der die soeben berechneten Verteilungen als Modell
    # verwendet.  Vervollstaendigen Sie dazu die Klasse GaussianClassifier im Modul
    # classification.
    #
    # Hinweise:
    #
    # Achten Sie darauf, dass Ihre Implementierung unabhaengig von den
    # verwendeten Klassenlabels ist. Aus den Trainingsdaten lassen sich diese mit
    # np.unique bestimmen.
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html
    #
    # Durch welche geeignete monotone Transformation lassen sich numerische
    # Probleme bei der Auswertung von extrem kleinen Dichtewerten vermeiden?
    # Beruecksichtigen Sie das in Ihrer Implementierung.

    test_data_provider = DataProvider(DataProvider.DATA2DROOT_TEST)
    test_data, test_labels_gt = test_data_provider.get_dataset_and_labels()
    bayes = GaussianClassifier()
    bayes.estimate(train_data, train_labels)
    estimated_labels = bayes.classify(test_data)

    # Fuehren Sie eine Evaluierung der Ergebnisse wie in Aufgabe 1 durch.
    evaluator = ClassificationEvaluator(estimated_labels, test_labels_gt)

    print("Error rate {}".format(evaluator.error_rate()))
    print("Category error rate {}".format(evaluator.category_error_rates()))

    crossvali = CrossValidation(train_data, train_labels, 5)

    over_all_result, class_result = crossvali.validate(GaussianClassifier())

    print(over_all_result)
示例#23
0
def aufg01():
    # Zur Einfuehrung werden auf einem Beispieldatensatz Klassifikatoren
    # implementiert. Der Datensatz data2d enthaelt zweidimensionalen
    # Trainingsmerkmale fuer drei Musterklassen. Fuer diese Daten soll eine
    # Klassifikation ueber Naechster-Nachbar realisiert  werden.
    # Achtung: Gestalten Sie Ihre Implementierung so, dass Sie die Klassifikatoren
    # fuer zukuenftige Aufgaben wiederverwenden koennen.

    # Im Folgenden wird der Beispieldatensatz ueber die Klasse DataProvided
    # geladen und anschliessend visualisiert. Machen Sie sich mit sowohl dem
    # Laden als auch der Visualisierung vertraut, da Sie in den kommenden
    # Aufgaben diese Aspekte wiederverwenden werden.
    # http://matplotlib.org/users/pyplot_tutorial.html
    #
    # Nuetzliche Funktionen: plt.scatter
    # http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.scatter
    #
    # Tipp: zu einer besseren Visualisierung sollten alle scatter plots in Matplotlib
    # immer mit dem Argument "edgecolor=(0, 0, 0)" aufgerufen werden.

    train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN)
    test_data_provider = DataProvider(DataProvider.DATA2DROOT_TEST)

    fig = plt.figure()
    ax = fig.add_subplot(111)

    # fig, (ax, ax2) = plt.subplots(1, 2)

    data = train_data_provider.get_class_arr(0)
    ax.scatter(data[:, 0], data[:, 1], c='#FF0000', edgecolor=(0, 0, 0))
    data = train_data_provider.get_class_arr(1)
    ax.scatter(data[:, 0], data[:, 1], c='#00FF00', edgecolor=(0, 0, 0))
    data = train_data_provider.get_class_arr(2)
    ax.scatter(data[:, 0], data[:, 1], c='#0000FF', edgecolor=(0, 0, 0))

    # plt.show()

    #
    # Implementieren Sie einen Naechster-Nachbar-Klassifikator.
    # Vervollstaendigen Sie dazu die Klasse KNNClassifier im Modul common.classifiers.
    # Testen Sie verschiedene Abstandsmasse. Welche halten Sie insbesondere fuer sinnvoll?
    train_data, train_labels = train_data_provider.get_dataset_and_labels()
    test_data, test_labels_gt = test_data_provider.get_dataset_and_labels()
    test_labels_gt = test_labels_gt.astype('float64')
    train_labels = train_labels.astype('float64')

    knn_classifier = KNNClassifier(
        k_neighbors=70, metric='cityblock')  # euclidean, cityblock, chebyshev
    knn_classifier.estimate(train_data, train_labels)
    estimated_labels = knn_classifier.classify(test_data)

    # print(len(estimated_labels==0))

    # print(test_labels_gt.shape, estimated_labels.shape)
    # print(test_labels_gt.dtype, estimated_labels.dtype)

    #
    #data_x = test_data[mask, 0]
    #data_y = test_data[mask, 1]
    #ax2.scatter(data_x, data_y, c='#FF0000', edgecolor=(0, 0, 0))
    #data = test_data[estimated_labels == 1]
    #ax2.scatter(data[:, 0], data[:, 1], c='#00FF00', edgecolor=(0, 0, 0))
    #data = test_data[estimated_labels == 2]
    #ax2.scatter(data[:, 0], data[:, 1], c='#0000FF', edgecolor=(0, 0, 0))
    #fig.tight_layout()
    #plt.show()

    #
    # Nutzen Sie zur Evaluation der Ergebnisse die Klasse ClassificationEvaluator
    # im Modul common.classifiers.

    evals = ClassificationEvaluator(estimated_labels, test_labels_gt)

    error_rate, n_wrong, n_samples = evals.error_rate()

    print(error_rate, n_wrong, n_samples)

    # raise NotImplementedError('Implement me')

    # Ein NN-Klassifikator alleine ist meist nicht ausreichend. Erweitern Sie
    # den Klassifikator zum k-NN Klassifikator.
    # Fuer den Mehrheitsentscheid ist das defaultdict nuetzlich (siehe intro).
    # https://docs.python.org/3/library/collections.html#collections.defaultdict

    # Trainingsparameter sollten immer per Kreuzvalidierung auf den Trainingsdaten
    # optimiert werden. Mit den besten Parametern wird dann ein Klassifikator
    # erstellt und auf den Testdaten evaluiert.
    # Nutzen Sie die Klasse CrossValidation im Modul classification um den
    # Parameter k zu optimieren.
    # In den folgenden Aufgaben ist es Ihnen freigestellt, ob Sie Kreuzvalidierung
    # nutzen oder direkt auf den Testdaten optimieren.

    cross = CrossValidation(train_data, train_labels, 5)

    for i in range(65, 76):

        knn = KNNClassifier(i, 'cityblock')
        crossval_overall_result, crossval_class_results = cross.validate(knn)
        print('Anzahl der Nachbarn = ', i, ' : ', crossval_overall_result)
    ''' Optimum bei k_neighbours = 70 '''
示例#24
0
def aufg03():
    #
    # Implementieren Sie einen Vektorquantisierer nach Lloyd.
    # Fuer Ihre Implementierung finden Sie einen Klassenrumpf in dem Modul
    # common.vector_quantization
    #
    # Ein anderer Vektorquantisierer ist der k-means-Algorithmus (nach McQueen,
    # siehe z.B. Skript Spracherkennung, S. 53 ff.).
    # Diskutieren Sie die Unterschiede zwischen Lloyd und k-means.
    # Achtung: In der Literatur ist mit k-means in der Regel der Lloyd-Algorithmus
    # gemeint.
     
    # ----------------------Disskussion-----------------------------------------
    # Der k-means algorhytmus beschreibt das problem der suche von
    # Clusterzentren zu einer gegebenen Anzahl von Clusterzentren. Beim
    # Lyod-Algorithmus geht es um die iterative suche der Clusterzentren. 

    # Welche Codebuchgroesse ist fuer die gegebene Verteilung von Daten geeignet?

    # ----------------------Codebuchgroesse-------------------------------------
    # Eine Codebuchgroesse von 5 scheint passend, da sich die 3 Klassen auf 5
    # Ballungszentren aufteilen. 

    train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN)
    train_data = train_data_provider.get_dataset_arr()

    
    # Waehlen Sie eine geeignete Codebuchgroesse und speichern Sie sie in der
    # lokalen Variablen codebook_size.
    
    codebook_size = 5
    # raise NotImplementedError('Implement me')

    
    # Im Nachfolgenden werden die Daten unabhaengig von der Klassenzugehoerigkeit
    # geclustert.
    lloyd_quantizer = Lloyd()
    codebook = lloyd_quantizer.cluster(train_data, codebook_size)

    
    # Quantisieren Sie die Trainingsdaten mit dem berechneten Codebuch.
    # Speichern Sie die Clusterindices der jeweiligen Samples in der lokalen
    # Variablen labels.
    
    # Nuetzliche Funktionen:
    # https://docs.scipy.org/doc/numpy/reference/generated/numpy.argmin.html

    dist = cdist(train_data[0], codebook)
    labels = np.argmin(dist, axis=1)
    # raise NotImplementedError('Implement me')

    
    # Berechnen Sie nun eine Normalverteilung je Cluster und visualisieren Sie diese.
    # Ueberlegen Sie, wie Normalverteilungen definiert sind und wie Sie die noetigen
    # Paramter auf Grundlage der Quantisierung bestimmen koennen.
    # Im Nachfolgenden ist bereits die Farbcodierung der Cluster implementiert.
    # Sie koennen die Variable c als Farbwerte in der visualization.plot_norm_dist_ellipse
    # Funktion verwenden.
    #
    # Nuetzliche Funktionen: np.cov
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html
    # Zur Visualisierung: visualization.plot_norm_dist_ellipse
   

    cmap = cm.get_cmap('hsv')
    c = cmap(np.linspace(0, 1, codebook_size))
   
    cov = [] 
    for label in np.unique(labels):
        cov.append(np.cov(train_data[label==labels], rowvar=0))
    #raise NotImplementedError('Implement me')

    
    # Visualisieren Sie die Zugehoerigkeit der einzelnen Samples zu den
    # Clustern. Im Nachfolgenden ist bereits die Farbcodierung der Daten
    # implementiert.
    # Sie koennen die Variable c als Farbwerte in der ax.scatter
    # Funktion verwenden.
    labels_norm = labels / float(codebook_size )
    cmap = cm.get_cmap('hsv')
    c = cmap(labels_norm)
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(train_data[:,0], train_data[:,1], c=c, edgecolor=(0,0,0))
    visualization.plot_norm_dist_ellipse(ax, codebook, cov, c)

    plt.show()
示例#25
0
def aufg04():
    #
    # Nutzen Sie den in Aufgabe 3 Vektorquantisierer fuer die Schaetzung eines
    # Gaussian Mixture Models.
    #
    # Implementieren Sie dazu die Klasse MDClassifierClassIndep im Modul common.classifiers.
    #
    # Welche zusaetzlichen Parameter werden neben den Mischverteilungsparametern
    # noch fuer die Klassifizierung benoetigt?
    #
    # Werten Sie Ihre Implementierung mit dem unten stehenden Code aus.

    train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN)
    train_data, train_labels = train_data_provider.get_dataset_and_labels()
    test_data_provider = DataProvider(DataProvider.DATA2DROOT_TEST)
    test_data, test_labels_gt = test_data_provider.get_dataset_and_labels()

    quant = Lloyd()
    classifier = MDClassifierClassIndep(quant, 10)
    classifier.estimate(train_data, train_labels)

    estimated_labels = classifier.classify(test_data)
    evaluator = ClassificationEvaluator(estimated_labels, test_labels_gt)
    print('Klassenunabhaengig:')
    print(
        'Fehlerrate: %.1f; Anzahl falsch-klassifizierte Muster: %d; Anzahl Muster: %d'
        % evaluator.error_rate())
    print('Klassenspezifische Fehlerraten')
    for res in evaluator.category_error_rates():
        print(
            'Klasse %s:\tFehlerrate: %.1f;\tAnzahl falsch-klassifizierte Muster: %d;\tAnzahl Muster: %d'
            % res)

    cmap = cm.get_cmap('hsv')
    fig = plt.figure()
    ax = fig.add_subplot(111)
    mean = classifier.mean
    cov = classifier.cov
    c = cmap(np.linspace(0, 1, len(cov)))
    visualization.plot_norm_dist_ellipse(ax, mean, cov, c)
    ax.scatter(train_data[:, 0],
               train_data[:, 1],
               c='#FFFFFF',
               edgecolor=(0, 0, 0))

    # Realisieren Sie den Mischverteilungsklassifikator mit klassenabhaengigen
    # Komponentendichten. Implementieren Sie dazu die Klasse MDClassifierClassDep
    # im Modul common.classifiers.

    classifier = MDClassifierClassDep(quant, (1, 3, 1))
    classifier.estimate(train_data, train_labels)

    estimated_labels = classifier.classify(test_data)
    evaluator = ClassificationEvaluator(estimated_labels, test_labels_gt)
    print('\n##################################################\n')
    print('Klassenabhaengig')
    print(
        'Fehlerrate: %.1f; Anzahl falsch-klassifizierte Muster: %d; Anzahl Muster: %d'
        % evaluator.error_rate())
    print('Klassenspezifische Fehlerraten')
    for res in evaluator.category_error_rates():
        print(
            'Klasse %s:\tFehlerrate: %.1f;\tAnzahl falsch-klassifizierte Muster: %d;\tAnzahl Muster: %d'
            % res)

    classes = classifier.classifier
    fig = plt.figure()
    ax = fig.add_subplot(111)
    for index, c in enumerate(classes):
        cov = c.cov
        col = [cmap(index / float(len(classes)))] * len(cov)
        visualization.plot_norm_dist_ellipse(ax, c.mean, cov, col)
        data = train_data_provider.get_class_arr(index)
        ax.scatter(data[:, 0], data[:, 1], c=col, edgecolor=(0, 0, 0))
    plt.show()
示例#26
0
 def _init(self):
   self.provider = DataProvider()
   self.provider.do()
示例#27
0
class TestFunctions(unittest.TestCase):

  def setUp(self):
    if IGNORE_TEST:
      return
    self._init()

  def _init(self):
    self.provider = DataProvider()
    self.provider.do()

  def testMakeTrinaryData(self):
    if IGNORE_TEST:
      return
    df = transform_data.makeTrinaryData(
        df=self.provider.df_normalized)
    columns = self.provider.df_normalized.columns
    self.assertTrue(helpers.isValidDataFrame(df, columns))

  def testAggregateGenes(self):
    if IGNORE_TEST:
      return
    provider = DataProvider()
    provider.do()
    df = transform_data.aggregateGenes(provider=provider)
    self.assertTrue(helpers.isValidDataFrame(df,
        provider.df_normalized.columns))

  def testTrinaryReadsDF1(self):
    if IGNORE_TEST:
      return
    provider = DataProvider()
    provider.do()
    df = provider.dfs_read_count[0]
    df_result = transform_data.trinaryReadsDF(
        df_sample=df)
    # See if number of "-1" is excessive
    dff = df_result + df_result.applymap(lambda v: -np.abs(v))
    frac_minus1 = -dff.sum().sum()  \
        /(2*len(df_result)*len(df_result.columns))
    self.assertLess(frac_minus1, 0.25)
    # Smoke tests for csv
    df_result = transform_data.trinaryReadsDF(
        csv_file="AM_MDM_Mtb_transcripts_DEseq.csv",
        is_time_columns=False)

  # TODO: Fix so working with the same transformation of features,
  #       either all genes features or all gene-groups.
  def testTrinaryReadsDF2(self):
    return
    # Checks that trinary values computed directly from reads
    # are the same as those of normalized samples.
    # Get raw value of read counts
    provider = DataProvider()
    provider.do()
    #
    def calcTrinaryTimeSample(time_index):
        """
        Calculates the trinary value of a time sample
        :param str time_index: name of time value
        """
        int_index = int(time_index[1:])
        df0 = provider.dfs_read_count[0]
        num = len(provider.dfs_read_count)
        ser = pd.Series(np.repeat(0, len(df0.index)), index=df0.index)
        for idx in range(num):
            ser += provider.dfs_read_count[idx][int_index]
        df = pd.DataFrame(ser/num)
        df_result = transform_data.trinaryReadsDF(df_sample=df)
        return df_result.T
    #
    data = TrinaryData()
    data.df_X.columns = data.features
    for time_index in data.df_X.index:
      df_result = calcTrinaryTimeSample(time_index)
      import pdb; pdb.set_trace()
        
  def testCalcTrinaryComparison(self):
    if IGNORE_TEST:
      return
    df_in = pd.DataFrame({'a': [4, 0.20, 1]})
    df_expected = pd.DataFrame({'a': [1, -1, 0]})
    ser_ref = pd.Series(np.repeat(1, len(df_in)))
    df_out = transform_data.calcTrinaryComparison(df_in, ser_ref,
        is_convert_log2=True)
    self.assertTrue(df_out.equals(df_expected))

  def testStripReplicaString(self):
    if IGNORE_TEST:
      return
    TIME = "TO"
    SIZE = 3
    names = ["%s.%d" % (TIME, n) for n in range(SIZE)]
    result = transform_data.stripReplicaString(names)
    self.assertEqual(result[0], TIME)
    self.assertEqual(len(result), SIZE)

  def testRemoveGenesWithExcessiveReplicationVariance(self):
    if IGNORE_TEST:
      return
    trinary = TrinaryData(is_averaged=False, is_dropT1=False,
        is_regulator=False)
    df_base = transform_data.removeGenesWithExcessiveReplicationVariance(
        trinary.df_X)
    for max_var in [1, 2, 3]:
      df = transform_data.removeGenesWithExcessiveReplicationVariance(
          trinary.df_X, max_var=max_var)
      self.assertGreaterEqual(len(df_base.columns), len(df.columns))

    ser = util.convertToLog2(SER)
    ser1 = util.unconvertFromLog2(ser)
    ser1.loc[0] = 0
    trues = [np.isclose(v1, v2) for v1, v2 in zip(ser1, SER)]
    self.assertTrue(all(trues))

  def testMakeBioreactorT0ReferenceData(self):
    if IGNORE_TEST:
      return
    ser = transform_data.makeBioreactorT0ReferenceData()
    self.assertTrue(isinstance(ser, pd.Series))
    self.assertGreater(ser.min(), 0)
    self.assertGreater(len(ser), 10)
示例#28
0
def aufg02():
    # In dieser Aufgabe soll ein Bayes'scher Normalverteilungs-Klassifikator
    # mit drei Dichten realisiert werden.
    #
    # Zunaechst sollen Mittelwert und Kovarianzmatrix der drei Klassen geschaetzt
    # und visualisiert werden:
    train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN)
    train_data, train_labels = train_data_provider.get_dataset_and_labels()
    train_labels = train_labels.astype('float64')

    labels = np.unique(train_labels)

    #
    # Extrahieren Sie die Klassen-Labels aus dem Trainingsdatensatz und speichern
    # Sie sie in der lokalen Variablen labels
    #
    # Nuetzliche Funktionen:
    # https://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html

    # raise NotImplementedError('Implement me')

    mean_list = []
    cov_list = []
    for label in labels:
        #
        # Berechnen Sie Mittelwert und Kovarianz der drei Klassen durch
        # Matrixoperationen in NumPy.
        # Speichern Sie fuer jeden Schleifendurchlauf den Mittelwert in der
        # lokalen Variablen mean und die Kovarianzmatrix in der lokalen Variablen
        # cov. Benutzen Sie zur Schaetzung die korrigierte Kovarianzmatrix:
        # https://de.wikipedia.org/wiki/Stichprobenkovarianz#Korrigierte_Stichprobenkovarianz

        class_data = train_data[train_labels==label]

        mean = sum(class_data)/len(class_data)
        meanx = sum(class_data[:, 0])/len(class_data[:, 0])
        meany = sum(class_data[:, 1])/len(class_data[:, 1])

        sx = 1/(len(class_data[:, 0]) - 1) * sum((class_data[:, 0] - meanx)**2)
        sy = 1/(len(class_data[:, 1]) - 1) * sum((class_data[:, 1] - meany)**2)
        sxy = 1/(len(class_data[:,0]) - 1) * sum((class_data[:, 0] - meanx) * (class_data[:, 1] - meany))

        cov = np.matrix([[sx, sxy], [sxy, sy]])

        #raise NotImplementedError('Implement me')
        np.testing.assert_almost_equal(actual=mean,
                                       desired=np.mean(class_data, axis=0),
                                       err_msg='Der Mittelwert ist falsch')
        np.testing.assert_almost_equal(actual=cov,
                                       desired=np.cov(class_data, rowvar=0),
                                       err_msg='Die Kovarianzmatrix ist falsch')
        mean_list.append(mean)
        cov_list.append(cov)

    #
    # Visualisieren Sie die Datenpunkte der drei Klassen, sowie die geschaetzen
    # Mittelwerte und Kovarianzmatrizen durch eine Normalverteilung.
    # Zur Visualisierung der Normalverteilungen: visualization.plot_norm_dist_ellipse

    fig = plt.figure()
    ax = fig.add_subplot(111)

    data = train_data_provider.get_class_arr(0)
    ax.scatter(data[:, 0], data[:, 1], c='#FF0000', edgecolor=(0, 0, 0))
    data = train_data_provider.get_class_arr(1)
    ax.scatter(data[:, 0], data[:, 1], c='#00FF00', edgecolor=(0, 0, 0))
    data = train_data_provider.get_class_arr(2)
    ax.scatter(data[:, 0], data[:, 1], c='#0000FF', edgecolor=(0, 0, 0))

    visualization.plot_norm_dist_ellipse(ax, mean_list, cov_list, color=['orange', 'darkgreen', 'cyan'])


    plt.show()

    # raise NotImplementedError('Implement me')

    #
    # Implementieren sie einen Bayes'schen Normalverteilungs-Klassifikator (ohne
    # Rueckweisung), der die soeben berechneten Verteilungen als Modell
    # verwendet.  Vervollstaendigen Sie dazu die Klasse GaussianClassifier im Modul
    # classification.
    #
    # Hinweise:
    #
    # Achten Sie darauf, dass Ihre Implementierung unabhaengig von den
    # verwendeten Klassenlabels ist. Aus den Trainingsdaten lassen sich diese mit
    # np.unique bestimmen.
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.unique.html
    #
    # Durch welche geeignete monotone Transformation lassen sich numerische
    # Probleme bei der Auswertung von extrem kleinen Dichtewerten vermeiden?
    # Beruecksichtigen Sie das in Ihrer Implementierung.

    test_data_provider = DataProvider(DataProvider.DATA2DROOT_TEST)
    test_data, test_labels_gt = test_data_provider.get_dataset_and_labels()
    test_labels_gt = test_labels_gt.astype('float64')
    bayes = GaussianClassifier()
    bayes.estimate(train_data, train_labels)
    estimated_labels = bayes.classify(test_data)

    #
    # Fuehren Sie eine Evaluierung der Ergebnisse wie in Aufgabe 1 durch.

    evals = ClassificationEvaluator(estimated_labels, test_labels_gt)
    error_rate, n_wrong, n_samples = evals.error_rate()
    print('Bayes:', error_rate, n_wrong, n_samples)
示例#29
0
def aufg07():
    #
    # Im Gegensatz zu den bisher verwendeten Klassifikatoren, die Klassengebiete
    # explizit ueber (Mischungen von) Gaussverteilungen modellieren, sollen nun
    # diskriminative Klassifikatoren untersucht werden. Als besonders leistungs-
    # faehig haben sich die in der Vorlesung behandelten Support Vector Maschinen
    # erwiesen.
    # Anhand der beiden bisher benutzten aber auch unter Verwendung eigener
    # Datensaetze soll nun die Mustererkennung mittels Support Vector Machines
    # untersucht werden.
    # Fuer Python stellt die Bibliothek 'sklearn' die Implementierung einer SVM
    # bereit.
    # http://scikit-learn.org/stable/modules/svm.html#svm
    # Zur Visualisierung der SVM kann die Funktion visualization.plot_svm
    # genutzt werden.

    # Der zweidimensionale Datensatz data2d enthaelt 3 Klassen.
    # Trainieren Sie zunaechst eine lineare Support Vector Maschine, die zur
    # Trennung von Klasse 0 und 2 verwendet werden soll. Klasse 1 wird hier
    # nicht betrachtet, da sie sich nicht linear von den Klassen 0 und 2 trennen
    # laesst (Siehe unten).
    # Wie hoch ist der Klassifikationsfehler im Vergleich zum Normalverteilungs-
    # klassifikator? Visualisieren Sie die resultierende Trennfunktion. Im Modul
    # visualization steht dafuer die Methode plot_svm bereit.
    # Diskutieren Sie den Einfluss der Slack-Variablen (in Form des C-Parameters)
    # auf die Trennfunktion und damit den entstehenden Klassifikationsfehler.
    #
    # Fuer die Evaluierung koennen Sie im Folgenden wieder den ClassificationEvaluator
    # aus dem Modul common.classifiers verwenden.

    train_data_provider = DataProvider(DataProvider.DATA2DROOT_TRAIN)
    test_data_provider = DataProvider(DataProvider.DATA2DROOT_TEST)

    train_data, train_labels = train_data_provider.get_dataset_and_labels()
    test_data, test_labels_gt = test_data_provider.get_dataset_and_labels()

    train_labels = train_labels.astype(dtype='float64')
    test_labels_gt = test_labels_gt.astype(dtype='float64')

    train_data_02 = np.concatenate((train_data_provider.get_class_arr(0),
                                    train_data_provider.get_class_arr(2)))
    train_labels_02 = np.concatenate(
        (train_labels[train_labels == 0], train_labels[train_labels == 2]))

    test_data_02 = np.concatenate((test_data_provider.get_class_arr(0),
                                   test_data_provider.get_class_arr(2)))
    test_labels_02 = np.concatenate((test_labels_gt[test_labels_gt == 0],
                                     test_labels_gt[test_labels_gt == 2]))

    clf = svm.LinearSVC()
    clf.fit(train_data_02, train_labels_02)

    estimated_labels = clf.predict(test_data_02)

    evals = ClassificationEvaluator(estimated_labels, test_labels_02)
    error_rate, n_wrong, n_samples = evals.error_rate()
    print(error_rate, n_wrong, n_samples)

    fig = plt.figure()
    ax = fig.add_subplot(111)
    visualization.plot_svm(ax,
                           test_data_02,
                           test_labels_02,
                           clf,
                           step_size=0.1)
    #plt.show()

    # raise NotImplementedError('Implement me')

    # Trainieren Sie nun eine SVM fuer die Klassen 1 und 2.
    # Evaluieren Sie, welcher Kernel geeignet ist, um das Problem zu loesen.

    train_data_12 = np.concatenate((train_data_provider.get_class_arr(1),
                                    train_data_provider.get_class_arr(2)))
    train_labels_12 = np.concatenate(
        (train_labels[train_labels == 1], train_labels[train_labels == 2]))

    test_data_12 = np.concatenate((test_data_provider.get_class_arr(1),
                                   test_data_provider.get_class_arr(2)))
    test_labels_12 = np.concatenate((test_labels_gt[test_labels_gt == 1],
                                     test_labels_gt[test_labels_gt == 2]))

    kernels = ['linear', 'poly', 'rbf', 'sigmoid']

    for kernel in kernels:
        clf = svm.SVC(kernel=kernel)
        clf.fit(train_data_12, train_labels_12)

        estimated_labels = clf.predict(test_data_12)

        evals = ClassificationEvaluator(estimated_labels, test_labels_12)
        error_rate, n_wrong, n_samples = evals.error_rate()
        print(kernel, error_rate, n_wrong, n_samples)

        fig = plt.figure()
        ax = fig.add_subplot(111)
        visualization.plot_svm(ax,
                               test_data_12,
                               test_labels_12,
                               clf,
                               step_size=0.1)
        #plt.show()

    # raise NotImplementedError('Implement me')

    # Trainieren Sie nun eine Multi-Class SVM zur Loesung des 3-Klassenproblems
    # unter Verwendung eines geeigneten Kernels.
    # Wie koennen die optimalen kernelspezifischen Parameter sinnvoll ermittelt
    # werden?
    # Hinweis: Starten Sie zunaechst mit den Grundeinstellungen der Bibliothek.

    clf = svm.SVC()
    clf.fit(train_data, train_labels)

    estimated_labels = clf.predict(test_data)

    evals = ClassificationEvaluator(estimated_labels, test_labels_gt)
    error_rate, n_wrong, n_samples = evals.error_rate()
    print('3 Klassen: bcf', error_rate, n_wrong, n_samples)

    fig = plt.figure()
    ax = fig.add_subplot(111)
    visualization.plot_svm(ax, test_data, test_labels_gt, clf, step_size=0.1)
示例#30
0
def aufg05():
    #
    # Realisieren Sie eine Hauptachsen-Transformation (PCA) in der Klasse PCA.
    # Zunaechst schauen wir uns das Prinzip an einem Spielbeispiel an.
    #
    # Mit der Methode pca_example wird die PCA anhand eines
    # 3D-Beispieldatensatzes visualisiert.
    # Nuetzliche Funktionen: np.linalg.eig
    # http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html
    # Achten Sie darauf, dass die NumPy Methode np.linalg.eig komplexwertige Ergebnisse
    # liefern kann. Dies kann an numerischen Ungenauigkeiten liegen. Verwenden Sie in
    # diesem Fall nur den Realteil.
    pca_example()

    #
    # Nachdem bisher mit artifiziellen Datensaetzen gearbeitet wurde, wenden wir
    # uns jetzt realen Daten zu. Dazu verwenden wir den MNIST-Datensatz der
    # Grauwert-Bilder handgeschriebener Ziffern enthaelt. Der MNIST-Datensatz
    # besteht im Original aus 60000 Trainingsbildern und 10000 Testbildern. Um
    # den Aufwand geringer zu halten, werden im Rahmen dieser Uebung
    # lediglich 1000 zufaellig ausgewaehlte Trainingsbilder pro Klasse verwendet.
    #
    # Somit ergibt sich ein Trainingsdatensatz von 10000 sowie ein
    # Testdatensatz von 10000 Bildern.
    #
    # Die 28 x 28 Pixel grossen Bilder koennen als 784-dimensionale Merkmalsvektoren
    # aufgefasst werden.
    #
    # Laden Sie die Trainingsdaten des MNIST-Datensatz.
    # Das Laden des Datensatzes kann einige Sekunden in Anspruch nehmen.
    # Mit show_data(data, width) koennen Sie Bilder anzeigen lassen. Die Anzahl der
    # Bilder muss ein Vielfaches des Parameters width sein.
    train_data_provider = DataProvider(DataProvider.MNIST_TRAIN)
    train_data = train_data_provider.get_dataset_arr()

    show_data(train_data[2000:2100, :], width=10)
    plt.show()

    # raise NotImplementedError('Implement me')

    # Transformieren Sie die 784-dimensionalen Daten des MNIST-Datensatzes in
    # einen geeignet gewaehlten niedriger-dimensionalen Merkmalsraum. Begruenden
    # Sie die gewaehlte Groesse.
    # Hinweis: Die Unterraumdimension laesst sich mit der moeglichen
    # Rekonstruktionsqualitaet verknuepfen.
    # Es ist empfehlenswert, die dimensionsreduzierten Daten fuer die spaetere
    # Nutzung zu speichern.
    # Nuetzliche Funktion: DataProvider.write_data oder pickle
    # Achten Sie darauf, dass DataProvider.write_data ein dictionary als
    # Eingabe erwartet.
    # Zu pickle finden Sie weitere Informationen hier:
    # https://docs.python.org/3/library/pickle.html
    # https://wiki.python.org/moin/UsingPickle

    # Optional: Visualisieren Sie die MNIST-Daten in einem 2D Unterraum. Faerben Sie
    # die Datenpunkte nach Klassenzugehoerigkeit.

    target_dim = 70

    pca = PCA(train_data)
    transformed = pca.transform_samples(train_data, target_dim)