本文是做者看慕課網學習記錄筆記,內容技術水準是入門,大佬看到請輕言指點,手下留情
機器學習的本質:模擬人的神經元
人工神經元原理:python
權重向量W,訓練樣本Ⅹgit
預測數據特色可線性分割,要求能夠把感知的值有一條線明確分割出來,目標就是找到中間的分割線
源碼地址: klinson/machine-learning-python
Python3.7.3github
自行下載Python環境包算法
須要安裝tkinterubuntu
// centos sudo yum install tkinter // ubuntu sudo apt-get install tkinter // cd python-path sudo ./configure --with-tcltk-includes="-I/usr/include" --with-tcltk-libs="-L/usr/lib64 -ltcl8.5 -L/usr/lib64 -ltk8.5" --enable-optimizations sudo make && sudo make install
文件名Perceptron.py
centos
# -*- coding: utf-8 -*- import numpy as np class Perceptron(object): """ Perceptron 感知器算法 eta: 學習率 n_iter: 權重向量的訓練次數 w_: 神經分叉權重向量 errors_: 用來記錄神經元判斷出錯次數 """ def __init__(self, eta = 0.01, n_iter = 0): self.eta = eta; self.n_iter = n_iter; pass def fit(self, X, y): """ 權重更新算法 根據輸入樣本,進行神經元培訓,x是輸入樣本向量,y對應樣本分類 X:shape[n_samples, n_features] X:[[1, 2, 3], [4, 5, 6]] n_samples: 2 n_features: 3 """ # 初始化權重爲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]] target = 1 / -1 """ for xi, target in zip(X, y): """ update = n(成功率) * (y - y'),結果爲0表示預測正確 target: y,預約結果 self.predict(xi): y', 對xi進行預測結果 """ update = self.eta * (target - self.predict(xi)); """ xi 是一個向量 update * xi 等級: [▽w(1) = x[1] * update, ▽w(2) = x[2] * update, ▽w(n) = x[n] * update] """ self.w_[1:] += update * xi; # 更新閾值 self.w_[0] += update; errors += int(update != 0.0) self.errors_.append(errors); pass pass pass def net_input(self, X): """ 實現向量點積 z = W0*x0+W1*x1+...+Wn*xn; """ return np.dot(X, self.w_[1:] + self.w_[0]) pass def predict(self, X): # 計算xn所屬於的分類,先進行點積,再進行判斷 return np.where(self.net_input(X) >= 0.0, 1, -1); pass
文件名main.py
網絡
# -*- coding: utf-8 -*- import pandas as pd import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap import numpy as np from Perceptron import Perceptron def plot_decision_regions(X, y, classifier, resolution=0.02): #畫圖劃線分割 markers = ['s', 'x', 'o', 'v']; colors= ['red', 'blue', 'lightred', '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, x2_min, x2_max); # 根據數據最大最小值構建向量,差值resolution xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)) #print(np.arange(x1_min, x1_max, resolution).shape, np.arange(x1_min, x1_max, resolution), xx1.shape, xx1) z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T); z = z.reshape(xx1.shape); 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=markers[idx], label=cl) pass plt.xlabel('花瓣長度'); plt.ylabel('花徑長度'); plt.legend(loc='upper left'); plt.show(); pass # 讀取文件 file = './examples.csv'; df = pd.read_csv(file, header=None); # print(df.head(10)) # 處理第4列表 y = df.loc[0: 100, 4].values; y = np.where(y == 'Tris-setosa', -1, 1); # print(y) # 講第0和2列取出來分析 X = df.iloc[0: 100, [0, 2]].values; # print(X) # 對數據可視化 """ plt.scatter(X[:5, 0], X[:5, 1], color='red', marker='o', label='setosa'),; plt.scatter(X[5:10, 0], X[5:10, 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(); """ # 繪製分割圖 plot_decision_regions(X, y, ppn, resolution=0.02)
文件名examples.csv
app
2.1,3.5,2.7,0.2,Tris-setosa 3.1,2.6,2.6,0.2,Tris-setosa 2.1,5.5,3.4,0.5,Tris-setosa 3.1,5.2,2.9,0.2,Tris-setosa 3.1,3.4,2.3,0.3,Tris-setosa 3.1,2.3,2.1,0.2,Tris-setosa 4.7,3.5,1.4,0.2,Tris-versicolor 4.3,7.3,1.1,0.1,Tris-versicolor 4.1,4.5,1.4,0.2,Tris-versicolor 4.4,4.2,1.3,0.3,Tris-versicolor
$ python main.py
未完待續,敬請期待