Tarea Semana 1 (MIT OLL)
Contenido
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]]))