def calcGramMaxtrix(X):
m = X.shape[0]
gram = np.zeros((m, m))
for i in range(m):
for j in range(i, m):
gram[i, j] = X[i].dot(X[j])
gram[j, i] = X[i].dot(X[j])
return gram
def calcI(X, y, a, b, i, gram):
#print (X.shape, y.shape, a. shape)
sum = 0
for j in range(X.shape[0]):
sum += a[j] *y[j] * gram[j, i]
return (sum + b)*y[i]
# 感知机原始形式
def perceptron(X, y, eta):
a, b = np.zeros(X.shape[0]),0
gram = calcGramMaxtrix(X)
isFinished = False
while not isFinished:
isFinished = True
for i in range(X.shape[0]):
if calcI(X, y, a, b, i, gram) <= 0:
isFinished = False
a[i] += eta
b += eta * y[i]
def f(x):
sum = 0
for j in range(X.shape[0]):
sum += a[j] *y[j] * X[j].dot(x)
return sum + b
return a, b, f