Tarea Semana 1 (MIT OLL)

Tarea Semana 1 (MIT OLL)

La ditancia de un punto a un plano esta dada por

\[ \frac{\theta^{T} \mathbf{p}+\theta_{0}}{\|\theta\|} \]
import numpy as np

1.2)

  • Entrada: punto y parametros del plano

  • Salida: distancia del punto a la recta

def signed_dist(x, th, th0):
    num = np.transpose(th) @ x + th0
    den = np.linalg.norm(th)
    dis = num / den
    return dis
# funciones auxiliares

def rv(value_list):
    return np.array([value_list])

def tp(A):
    return np.transpose(A)

def cv(value_list):
    return tp(rv(value_list))
th = cv([1,1])
th0 = 0
x = cv([3,4])
print(signed_dist(x,th,th0))

x = cv([-3,-4])
print(signed_dist(x,th,th0))
[[4.94974747]]
[[-4.94974747]]

1.3)

  • Entradas: punto, parametros del hiperplano, en formato columna

  • Salidas: arrglo de \(1\times 1\) (2D), con +1 lado positivo, -1 lado nedativo, 0 sobre el plano

def positive(x, th, th0):
    dist = signed_dist(x, th, th0)
    return np.sign(dist)
th = cv([1,1])
th0 = 0
x = cv([3,4])
print(positive(x,th,th0))

x = cv([-3,-4])
print(positive(x,th,th0))

x = cv([-1,1])
print(positive(x,th,th0))
[[1.]]
[[-1.]]
[[0.]]
th = cv([1,-1,2,-3])
th0 = 0
data = np.transpose(np.array([[1,-1,2,-3],[1,2,3,4],[-1,-1,-1,-1],[1,1,1,1]]))

positive(data,th,th0)
array([[ 1., -1.,  1., -1.]])

1.4)

data = np.transpose(np.array([[1, 2], [1, 3], [2, 1], [1, -1], [2, -1]]))
labels = rv([-1, -1, +1, +1, +1])

Dados los parametros del hiperplanp aplicar positive a data y verificar que tanto se parecen a las etiquetas dadas

data = np.transpose(np.array([[1, 2], [1, 3], [2, 1], [1, -1], [2, -1]]))
labels = rv([-1, -1, +1, +1, +1])
th = cv([1,1])
th0 = -2
clasi = positive(data,th,th0)
clasi
array([[ 1.,  1.,  1., -1., -1.]])
clasi == labels
array([[False, False,  True, False, False]])

1.5)

Automatizar lo anterior. Regresa el número de clasificaciones correctas

def score(data, labels, th, th0):
    compara = positive(data,th,th0) == labels
    return compara.sum()
score(data, labels, th, th0)
1

1.6)

Dados un conjunto de hiperpalno, elegir al mejor entre una cantidad dada. El mejor es aquel que genere mayor score

def best_separator(data, labels, ths, th0s):
    _, c = ths.shape
    lista = []
    for i in range(c):
        lista.append(score(data, labels, th, th0))
    maxi = max(lista)
    idx = lista.index(maxi)
    vec = ths[:,idx]
    return (cv(vec), th0s[:,idx:idx+1])
ths = np.transpose(np.array([[-1, 2], [1, -2], [-2, -1]]))
th0s = np.array([[-1,1,-2]])
                   
best_separator(data, labels, ths, th0s)
(array([[-1],
        [ 2]]),
 array([[-1]]))