最近开始进军人工智能,但是对于其基础还是要打牢固的!
对于神经网络,其原型及人体神经元,通过信息数据的输入交给神经元判断,再尤其将计算后的结果(高低电平)发送给下一个。
本手记记录了感知器分类算法的python实现
——实现感知器对象
——数据解析和可视化
——神经网络对数据实现分类
以上是其算法流程图,权重向量W,训练样本X
1、把权重向量初始化为0,或把每个分量初始化为【0,1】间任意小数
2、把训练样本输入感知器,得到分类结果(-1或1)
3、根据分类结果更新权重向量
以下给出部分代码
import numpy as np
class Perceptron(object):
"""
eta:学习率
n_iter:权重向量的训练次数
w_:神经分叉权重向量
errors:用于记录神经元判断出错次数
"""
def __init__(self, eta=0.01, n_iter=10):
self.eta = eta
self.n_iter = n_iter
pass
def net_input(self, x):
"""
z = w0*1 + w1*x1 + ... + wn*xn
:param x:
:return:
"""
return np.dot(x, self.w_[1:] + self.w_[0])
pass
def predict(self, x):
return np.where(self.net_input(x) >= 0.0, 1, -1)
pass
def fit(self, x, y):
"""
输入训练数据,培训神经元
:param x: 输入样本向量
:param y: 对应样本分类
:return:
x:shape[n_samples, n_features]
x:[[1,2,3],[4,5,6]]
n_samples: 2
n_features: 3
y:[1,-1]
"""
"""
初始化权重向量为0
加一是因为前面算法提到的w0,也就是步调函数阈值
"""
self.w_ = np.zeros(1 + x.shape[1])
self.errors_ = []
for _ in range(self.n_iter):
errors = 0
"""
x:[[1,2,3],[4,5,6]]
y:[1,-1]
zip(x,y) = [[1,2,3,1],[4,5,6,-1]]
"""
for xi, target in zip(x,y):
"""
update = n * (y - y')
"""
update = self.eta * (target - self.predict(xi))
"""
xi 是一个向量
update * xi 等价:
w(1)=x[1]*update,w(2)=x[2]*update,w(3)=x[3]*update
"""
self.w_[1:] += update * xi
self.w_[0] += update
errors += int(update != 0.0)
self.errors_.append(errors)
pass
pass
pass
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import ListedColormap
from marget.Rerceptron import Perceptron
dataset = pd.read_csv('datassex.csv', header=None)
# print(dataset)
y = dataset.loc[0:36, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)
X = dataset.loc[0:36, [0, 2]].values
# plt.scatter(X[:18,0],X[:18,1],color='red',marker='o',label='setosa')
# plt.scatter(X[18:36,0],X[18:36,1],color='blue',marker='x',label='versicolor')
# plt.xlabel('花瓣长度')
# plt.ylabel('花径长度')
# plt.legend(loc='upper left')
# plt.show()
ppn = Perceptron(eta=0.1, n_iter=10)
ppn.fit(X, y)
# plt.plot(range(1,len(ppn.errors_)+1),ppn.errors_,marker='o')
# plt.xlabel('Epochs')
# plt.ylabel('错误分类次数')
# plt.show()
def polt_decision_regions(X,y,classifier,resolution=0.02):
markers = ('s', 'x', 'o', 'v')
colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan')
cmap = ListedColormap(colors[:len(np.unique(y))])
x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max()
x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max()
# print(x1_min,x1_max)
# print(x2_min,x2_max)
xx1, xx2 = np.meshgrid(np.arange(x1_min,x1_max,resolution),
np.arange(x2_min,x2_max,resolution))
z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
print(xx1.ravel())
print(xx2.ravel())
print(z)
z = z.reshape(xx1.shape)
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
plt.contourf(xx1, xx2, z, alpha=0.4, cmap=cmap)
for idx, cl in enumerate(np.unique(y)):
plt.scatter(x=X[y == cl, 0], y=X[y == cl, 1], alpha=0.8, c=cmap(idx),
marker=markers[idx], label=cl)
pass
pass
polt_decision_regions(X, y, ppn, resolution=0.02)
plt.xlabel('flower length')
plt.ylabel('tree length')
plt.legend(loc='upper left')
plt.show()