Source code for hal.data.matrix
#!/usr/bin/env python
# coding: utf-8
"""Functions to deal with matrices"""
from sklearn.preprocessing import LabelEncoder
from hal.maths.utils import divide
[docs]class Matrix:
"""Table of data"""
def __init__(self, matrix):
self.matrix = matrix
[docs] def precision(self):
"""Calculates precision
:return: Precision of matrix
"""
true_pos = self.matrix[0][0]
false_pos = self.matrix[1][0]
return divide(1.0 * true_pos, true_pos + false_pos)
[docs] def recall(self):
"""Calculates recall
:return: Recall
"""
true_pos = self.matrix[0][0]
false_neg = self.matrix[0][1]
return divide(1.0 * true_pos, true_pos + false_neg)
[docs] def true_neg_rate(self):
"""Calculates true negative rate
:return: true negative rate
"""
false_pos = self.matrix[1][0]
true_neg = self.matrix[1][1]
return divide(1.0 * true_neg, true_neg + false_pos)
[docs] def accuracy(self):
"""Calculates accuracy
:return: Accuracy
"""
true_pos = self.matrix[0][0]
false_pos = self.matrix[1][0]
false_neg = self.matrix[0][1]
true_neg = self.matrix[1][1]
num = 1.0 * (true_pos + true_neg)
den = true_pos + true_neg + false_pos + false_neg
return divide(num, den)
[docs] def f1_score(self):
"""Calculates F1 score
:return: F1 score
"""
m_pre = self.precision()
rec = self.recall()
return divide(2.0, 1.0 / m_pre + 1.0 / rec) # harmonic mean
[docs] def get_as_list(self):
"""List of all values in matrix
:return: list representation
"""
return sum([
row
for row in self.matrix
], [])
[docs] def encode(self):
"""Encodes matrix
:return: Encoder used
"""
encoder = LabelEncoder() # encoder
values = self.get_as_list()
encoded = encoder.fit_transform(values) # long list of encoded
n_columns = len(self.matrix[0])
n_rows = len(self.matrix)
self.matrix = [
encoded[i: i + n_columns]
for i in range(0, n_rows * n_columns, n_columns)
]
return encoder
[docs] def decode(self, encoder):
"""Decodes matrix
:param encoder: Encoder used to encode matrix
:return: list: Decodes matrix
"""
self.matrix = [
encoder.inverse_transform(row)
for row in self.matrix
]
[docs] def get_column(self, index):
"""Gets column at given index
:param index: index of column
:return: Column
"""
return [
row[index]
for row in self.matrix
]
[docs] @staticmethod
def from_columns(columns):
"""Parses raw columns
:param columns: matrix divided into columns
:return: Matrix: Merge the columns to form a matrix
"""
data = [
[
column[i]
for i in range(len(column))
]
for column in columns
]
return Matrix(data)