老师没有把代码贴出来,光看老师讲映像不够深刻,还是要自己动手。同学把自己整理的代码贴出来给大家看看:
iris数据集:
| 5.1 | 3.5 | 1.4 | 0.2 | Iris-setosa |
| 4.9 | 3 | 1.4 | 0.2 | Iris-setosa |
| 4.7 | 3.2 | 1.3 | 0.2 | Iris-setosa |
| 4.6 | 3.1 | 1.5 | 0.2 | Iris-setosa |
| 5 | 3.6 | 1.4 | 0.2 | Iris-setosa |
| 5.4 | 3.9 | 1.7 | 0.4 | Iris-setosa |
| 4.6 | 3.4 | 1.4 | 0.3 | Iris-setosa |
| 5 | 3.4 | 1.5 | 0.2 | Iris-setosa |
| 4.4 | 2.9 | 1.4 | 0.2 | Iris-setosa |
| 4.9 | 3.1 | 1.5 | 0.1 | Iris-setosa |
| 5.4 | 3.7 | 1.5 | 0.2 | Iris-setosa |
| 4.8 | 3.4 | 1.6 | 0.2 | Iris-setosa |
| 4.8 | 3 | 1.4 | 0.1 | Iris-setosa |
| 4.3 | 3 | 1.1 | 0.1 | Iris-setosa |
| 5.8 | 4 | 1.2 | 0.2 | Iris-setosa |
| 5.7 | 4.4 | 1.5 | 0.4 | Iris-setosa |
| 5.4 | 3.9 | 1.3 | 0.4 | Iris-setosa |
| 5.1 | 3.5 | 1.4 | 0.3 | Iris-setosa |
| 5.7 | 3.8 | 1.7 | 0.3 | Iris-setosa |
| 5.1 | 3.8 | 1.5 | 0.3 | Iris-setosa |
| 5.4 | 3.4 | 1.7 | 0.2 | Iris-setosa |
| 5.1 | 3.7 | 1.5 | 0.4 | Iris-setosa |
| 4.6 | 3.6 | 1 | 0.2 | Iris-setosa |
| 5.1 | 3.3 | 1.7 | 0.5 | Iris-setosa |
| 4.8 | 3.4 | 1.9 | 0.2 | Iris-setosa |
| 5 | 3 | 1.6 | 0.2 | Iris-setosa |
| 5 | 3.4 | 1.6 | 0.4 | Iris-setosa |
| 5.2 | 3.5 | 1.5 | 0.2 | Iris-setosa |
| 5.2 | 3.4 | 1.4 | 0.2 | Iris-setosa |
| 4.7 | 3.2 | 1.6 | 0.2 | Iris-setosa |
| 4.8 | 3.1 | 1.6 | 0.2 | Iris-setosa |
| 5.4 | 3.4 | 1.5 | 0.4 | Iris-setosa |
| 5.2 | 4.1 | 1.5 | 0.1 | Iris-setosa |
| 5.5 | 4.2 | 1.4 | 0.2 | Iris-setosa |
| 4.9 | 3.1 | 1.5 | 0.1 | Iris-setosa |
| 5 | 3.2 | 1.2 | 0.2 | Iris-setosa |
| 5.5 | 3.5 | 1.3 | 0.2 | Iris-setosa |
| 4.9 | 3.1 | 1.5 | 0.1 | Iris-setosa |
| 4.4 | 3 | 1.3 | 0.2 | Iris-setosa |
| 5.1 | 3.4 | 1.5 | 0.2 | Iris-setosa |
| 5 | 3.5 | 1.3 | 0.3 | Iris-setosa |
| 4.5 | 2.3 | 1.3 | 0.3 | Iris-setosa |
| 4.4 | 3.2 | 1.3 | 0.2 | Iris-setosa |
| 5 | 3.5 | 1.6 | 0.6 | Iris-setosa |
| 5.1 | 3.8 | 1.9 | 0.4 | Iris-setosa |
| 4.8 | 3 | 1.4 | 0.3 | Iris-setosa |
| 5.1 | 3.8 | 1.6 | 0.2 | Iris-setosa |
| 4.6 | 3.2 | 1.4 | 0.2 | Iris-setosa |
| 5.3 | 3.7 | 1.5 | 0.2 | Iris-setosa |
| 5 | 3.3 | 1.4 | 0.2 | Iris-setosa |
| 7 | 3.2 | 4.7 | 1.4 | Iris-versicolor |
| 6.4 | 3.2 | 4.5 | 1.5 | Iris-versicolor |
| 6.9 | 3.1 | 4.9 | 1.5 | Iris-versicolor |
| 5.5 | 2.3 | 4 | 1.3 | Iris-versicolor |
| 6.5 | 2.8 | 4.6 | 1.5 | Iris-versicolor |
| 5.7 | 2.8 | 4.5 | 1.3 | Iris-versicolor |
| 6.3 | 3.3 | 4.7 | 1.6 | Iris-versicolor |
| 4.9 | 2.4 | 3.3 | 1 | Iris-versicolor |
| 6.6 | 2.9 | 4.6 | 1.3 | Iris-versicolor |
| 5.2 | 2.7 | 3.9 | 1.4 | Iris-versicolor |
| 5 | 2 | 3.5 | 1 | Iris-versicolor |
| 5.9 | 3 | 4.2 | 1.5 | Iris-versicolor |
| 6 | 2.2 | 4 | 1 | Iris-versicolor |
| 6.1 | 2.9 | 4.7 | 1.4 | Iris-versicolor |
| 5.6 | 2.9 | 3.6 | 1.3 | Iris-versicolor |
| 6.7 | 3.1 | 4.4 | 1.4 | Iris-versicolor |
| 5.6 | 3 | 4.5 | 1.5 | Iris-versicolor |
| 5.8 | 2.7 | 4.1 | 1 | Iris-versicolor |
| 6.2 | 2.2 | 4.5 | 1.5 | Iris-versicolor |
| 5.6 | 2.5 | 3.9 | 1.1 | Iris-versicolor |
| 5.9 | 3.2 | 4.8 | 1.8 | Iris-versicolor |
| 6.1 | 2.8 | 4 | 1.3 | Iris-versicolor |
| 6.3 | 2.5 | 4.9 | 1.5 | Iris-versicolor |
| 6.1 | 2.8 | 4.7 | 1.2 | Iris-versicolor |
| 6.4 | 2.9 | 4.3 | 1.3 | Iris-versicolor |
| 6.6 | 3 | 4.4 | 1.4 | Iris-versicolor |
| 6.8 | 2.8 | 4.8 | 1.4 | Iris-versicolor |
| 6.7 | 3 | 5 | 1.7 | Iris-versicolor |
| 6 | 2.9 | 4.5 | 1.5 | Iris-versicolor |
| 5.7 | 2.6 | 3.5 | 1 | Iris-versicolor |
| 5.5 | 2.4 | 3.8 | 1.1 | Iris-versicolor |
| 5.5 | 2.4 | 3.7 | 1 | Iris-versicolor |
| 5.8 | 2.7 | 3.9 | 1.2 | Iris-versicolor |
| 6 | 2.7 | 5.1 | 1.6 | Iris-versicolor |
| 5.4 | 3 | 4.5 | 1.5 | Iris-versicolor |
| 6 | 3.4 | 4.5 | 1.6 | Iris-versicolor |
| 6.7 | 3.1 | 4.7 | 1.5 | Iris-versicolor |
| 6.3 | 2.3 | 4.4 | 1.3 | Iris-versicolor |
| 5.6 | 3 | 4.1 | 1.3 | Iris-versicolor |
| 5.5 | 2.5 | 4 | 1.3 | Iris-versicolor |
| 5.5 | 2.6 | 4.4 | 1.2 | Iris-versicolor |
| 6.1 | 3 | 4.6 | 1.4 | Iris-versicolor |
| 5.8 | 2.6 | 4 | 1.2 | Iris-versicolor |
| 5 | 2.3 | 3.3 | 1 | Iris-versicolor |
| 5.6 | 2.7 | 4.2 | 1.3 | Iris-versicolor |
| 5.7 | 3 | 4.2 | 1.2 | Iris-versicolor |
| 5.7 | 2.9 | 4.2 | 1.3 | Iris-versicolor |
| 6.2 | 2.9 | 4.3 | 1.3 | Iris-versicolor |
| 5.1 | 2.5 | 3 | 1.1 | Iris-versicolor |
| 5.7 | 2.8 | 4.1 | 1.3 | Iris-versicolor |
| 6.3 | 3.3 | 6 | 2.5 | Iris-virginica |
| 5.8 | 2.7 | 5.1 | 1.9 | Iris-virginica |
| 7.1 | 3 | 5.9 | 2.1 | Iris-virginica |
| 6.3 | 2.9 | 5.6 | 1.8 | Iris-virginica |
| 6.5 | 3 | 5.8 | 2.2 | Iris-virginica |
| 7.6 | 3 | 6.6 | 2.1 | Iris-virginica |
| 4.9 | 2.5 | 4.5 | 1.7 | Iris-virginica |
| 7.3 | 2.9 | 6.3 | 1.8 | Iris-virginica |
| 6.7 | 2.5 | 5.8 | 1.8 | Iris-virginica |
| 7.2 | 3.6 | 6.1 | 2.5 | Iris-virginica |
| 6.5 | 3.2 | 5.1 | 2 | Iris-virginica |
| 6.4 | 2.7 | 5.3 | 1.9 | Iris-virginica |
| 6.8 | 3 | 5.5 | 2.1 | Iris-virginica |
| 5.7 | 2.5 | 5 | 2 | Iris-virginica |
| 5.8 | 2.8 | 5.1 | 2.4 | Iris-virginica |
| 6.4 | 3.2 | 5.3 | 2.3 | Iris-virginica |
| 6.5 | 3 | 5.5 | 1.8 | Iris-virginica |
| 7.7 | 3.8 | 6.7 | 2.2 | Iris-virginica |
| 7.7 | 2.6 | 6.9 | 2.3 | Iris-virginica |
| 6 | 2.2 | 5 | 1.5 | Iris-virginica |
| 6.9 | 3.2 | 5.7 | 2.3 | Iris-virginica |
| 5.6 | 2.8 | 4.9 | 2 | Iris-virginica |
| 7.7 | 2.8 | 6.7 | 2 | Iris-virginica |
| 6.3 | 2.7 | 4.9 | 1.8 | Iris-virginica |
| 6.7 | 3.3 | 5.7 | 2.1 | Iris-virginica |
| 7.2 | 3.2 | 6 | 1.8 | Iris-virginica |
| 6.2 | 2.8 | 4.8 | 1.8 | Iris-virginica |
| 6.1 | 3 | 4.9 | 1.8 | Iris-virginica |
| 6.4 | 2.8 | 5.6 | 2.1 | Iris-virginica |
| 7.2 | 3 | 5.8 | 1.6 | Iris-virginica |
| 7.4 | 2.8 | 6.1 | 1.9 | Iris-virginica |
| 7.9 | 3.8 | 6.4 | 2 | Iris-virginica |
| 6.4 | 2.8 | 5.6 | 2.2 | Iris-virginica |
| 6.3 | 2.8 | 5.1 | 1.5 | Iris-virginica |
| 6.1 | 2.6 | 5.6 | 1.4 | Iris-virginica |
| 7.7 | 3 | 6.1 | 2.3 | Iris-virginica |
| 6.3 | 3.4 | 5.6 | 2.4 | Iris-virginica |
| 6.4 | 3.1 | 5.5 | 1.8 | Iris-virginica |
| 6 | 3 | 4.8 | 1.8 | Iris-virginica |
| 6.9 | 3.1 | 5.4 | 2.1 | Iris-virginica |
| 6.7 | 3.1 | 5.6 | 2.4 | Iris-virginica |
| 6.9 | 3.1 | 5.1 | 2.3 | Iris-virginica |
| 5.8 | 2.7 | 5.1 | 1.9 | Iris-virginica |
| 6.8 | 3.2 | 5.9 | 2.3 | Iris-virginica |
| 6.7 | 3.3 | 5.7 | 2.5 | Iris-virginica |
| 6.7 | 3 | 5.2 | 2.3 | Iris-virginica |
| 6.3 | 2.5 | 5 | 1.9 | Iris-virginica |
| 6.5 | 3 | 5.2 | 2 | Iris-virginica |
| 6.2 | 3.4 | 5.4 | 2.3 | Iris-virginica |
| 5.9 | 3 | 5.1 | 1.8 | Iris-virginica |
import numpy as np
class Perceptron(object):
"""
eta:学习率
n_iter:权重向量的训练次数
w_:神经分叉权重向量
errors:用于记录神经元判断出错次数
"""
def __init__(self, eta, n_iter):
self.eta=eta
self.n_iter=n_iter
pass
def net_input(self,X):
"""
z = W0*1 + W1*X1 +.... Wn*Xn
"""
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):
"""
输入训练数据,训练神经元,x输入样本向量,y对应样本的正确分类
X:shape[n_samples, n_features]
eg: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 = 学习率 * (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
file = "D:/PyCharm_test_file/Jupyter_test/iris1.xlsx"
import pandas as pd
df = pd.read_excel(file,header=None)
#df.head(10)
#print(df)
import matplotlib.pyplot as plt
import numpy as npy = df.loc[0:99, 4].values
y = np.where(y == 'Iris-setosa', -1, 1)
#print(y)
X = df.iloc[0:100, [0, 2]].values
#print(X)
plt.scatter(X[:50, 0], X[:50, 1], color='red', marker='o', label='setosa')
plt.scatter(X[50:100, 0], X[50:100, 1], color='blue', marker='x', label='vericolor')
plt.rcParams['font.sans-serif']=['SimHei']
plt.xlabel('花瓣长度')
plt.ylabel('花茎长度')
plt.legend(loc='upper left')
plt.show()
from matplotlib.colors import ListedColormap
def plot_decision_regions(X, y, classifier, resolution=0.02):
marker = ('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()
#将x1、x2最大最小值通过arange函数得到的向量,扩展成两个二维矩阵
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) #ravel还原成单维向量
#绘制
Z= Z.reshape(xx1.shape) #将Z转换成与xx1一样的二维数组
plt.contourf(xx1, xx2, Z, alpha=0.4, cmap=cmap) #在两组分类结果中间画分割线-->必须线性可分
plt.xlim(xx1.min(), xx1.max())
plt.ylim(xx2.min(), xx2.max())
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=marker[idx], label=cl)
ppn = Perceptron(0.1, 10)
ppn.fit(X, y)
plot_decision_regions(X, y, ppn, resolution=0.02)