总结一下4月的模式识别作业
1.Fisher线性判别器
import numpy as np
class Fisher:
def __init__(self):
self.W = None
self.b = None
self.W_b_gather = {}
def train(self, X, iter=0):
Sw = np.zeros((X[0].shape[0], X[0].shape[0]), dtype=float)
m =[]
for i in range(2):
m.append(np.mean(X[i], axis=1, keepdims=1))
X[i] = X[i] - m[i]
Sw += np.dot(X[i], X[i].T)
self.W = np.linalg.inv(Sw).dot(m[0] - m[1])
self.b = -1/2 * (self.W.T.dot(m[0]) + self.W.T.dot(m[1]))[0]
self.W_b_gather[str(iter)] = [self.W.copy().T, self.b.copy()]
def plot(self, x1, x2):
m1 = []
m2 = []
m1.append(x1)
m2.append(-(self.b + self.W[0] * m1[0]) / self.W[1])
m1.append(x2)
m2.append(-(self.b + self.W[0] * m1[1]) / self.W[1])
return m1, m2
def predict(self, X, iter=0):
W = self.W_b_gather[str(iter)][0]
b = self.W_b_gather[str(iter)][1]
y_pred = np.dot(W, X) + b
y_pred[y_pred > 0] = 1
y_pred[y_pred < 0] = -1
return y_pred.T
def predict_m(self, X, class_num):
W = []
b = []
for i in range(class_num):
W.append(self.W_b_gather[str(i)][0][0])
b.append(self.W_b_gather[str(i)][1])
W = np.array(W)
b = np.array(b).reshape(-1, 1)
scored = np.dot(W, X) + b
y_pred = np.argmax(scored, axis=0) + 1
return y_pred.reshape(-1, 1)
def redimension(self, X):
return self.W.dot(X)
2.感知机
import numpy as np
import random
import os
class Preceptron:
#感知机一般处理二分类问题,通过点到分类超平面的距离,判断类别
# 点到直线距离
def __init__(self):
self.W = None
self.b = None
#训练
def train(self, X, y, learning_rate=1e-3, num_iters=1000, verbose=Tru