對於下面題目,分別用自程式設計和 sklearn 庫實現。
已知訓練資料集d,其正例項點是x1=(3,3)t,x2=(4,3)t,負例項點是x3=(1,1)t:參考preceptron.py(1) 用python 自程式設計實現感知機模型,對訓練資料集進行分類,並對比誤分類點選擇次序不同對最終結果的影響。可採用函式式程式設計或物件導向的程式設計。
(2)試呼叫sklearn.linear_model 的perceptron模組,對訓練資料集進行分類,並對比不同學習率h對模型學習速度及結果的影響。
import numpy as np
import matplotlib.pyplot as plt
class myperceptron:
def __init__(self):
# 初始化w b為0,w是向量,所以是none
self.w = none
self.b = 0
self.l_rate = 1
def fit(self, x_train, y_train):
# 用樣本點的特徵數更新初始w
self.w = np.zeros(x_train.shape[1])
i = 0
# 樣本點從下標0開始
while i < x_train.shape[0]:
x = x_train[i]
y = y_train[i]
# 如果y*(wx+b)<=0,樣本i為誤判點,更新w,b
if y * (np.dot(self.w, x) + self.b) <= 0:
self.w = self.w + self.l_rate * np.dot(y, x)
self.b = self.b + self.l_rate * y
i = 0 # 因為是誤判點,所以從新開始
else:
i += 1
def draw(x, w, b):
# 生產分離超平面上的兩點
x_new = np.array([[0], [6]])
y_predict = -b - (w[0] * x_new) / w[1]
# 繪製訓練集資料的散點圖
plt.plot(x[:2, 0], x[:2, 1], "g*", label="1")
plt.plot(x[2:, 0], x[2:, 0], "rx", label="-1")
# 繪製分離超平面
plt.plot(x_new, y_predict, "b-")
# 設定兩座標軸起止值
plt.axis([0, 6, 0, 6])
plt.xlabel("x1")
plt.ylabel("x2")
# 顯示圖例
plt.legend()
# 顯示影象
plt.show()
def main():
# 構造訓練資料集
x_train = np.array([[3, 3], [4, 3], [1, 1]])
y_train = np.array([1, 1, -1])
# 構建感知機物件,對資料集進行訓練
perceptron = myperceptron()
perceptron.fit(x_train, y_train)
print(perceptron.w)
print(perceptron.b)
# 結果影象繪製
draw(x_train, perceptron.w, perceptron.b)
if __name__ == "__main__":
main()
參考skl_preceptron.py
# -*- coding: utf-8 -*-
from sklearn.linear_model import perceptron
import numpy as np
# 構造訓練資料集
x_train = np.array([[3, 3], [4, 3], [1, 1]])
y = np.array([1, 1, -1])
perceptron = perceptron()
# perceptron=perceptron(penalty="l2",alpha=0.01,eta0=1,max_iter=50,tol=1e-3)
perceptron.fit(x_train, y)
# 檢視訓練後感知機的各個引數
print(
"w:", perceptron.coef_, "\n", "b:", perceptron.intercept_,
)res = perceptron.score(x_train, y)
print("correct rate:".format(res))
屬性-變數
屬性含義
coef_(權重)
對應wintercept_
對應bn_iter_
迭代次數
方法-函式
方法用處
fit用於訓練資料集
score
用來評價訓練效果
模型訓練引數
引數預設值
可選值penalty(正則化項)
none
'l1'or'l2'or'elasticnet'
alpha(正則化係數)
0.0001
eta0(學習率)
1(0,1]
max_iter(迭代次數)
5如果tol不為none則為1000
tol(終止條件)
none
(previous_loss)
q1:學習率對迭代過程和最終結果有無影響?
q2:無影響的條件是什麼?
a:無影響,條件是 w、b 的初始值均為 0 。當二者初始值為 0 時,二者值的更新都是學習率的倍數。
q3:l1 l2 分別有什麼作用?
a: l1 使特徵值更稀疏,l2 使 權值更均勻。
q4:正則化洗漱對正則化有何影響?
a: 過小無約束效力,過大則約束的太狠。
實現簡單感知機 資料分析 自程式設計實現感知機模型
本不打算寫感知機模型,因為其實在太簡單,在實際業務中也很少用到!可後來接觸越來越多的演算法,發現感知機模型才是最為簡接概述分類模型三要素 模型,策略,演算法!想來,李航博士將其作為 統計學習方法 分類模型第一章,大概就是出於這個原因!從這段話中,可以抽象出分類模型三要素 感知機模型的假設空間 分離超...
K近鄰 自程式設計和sklearn實現)
思考k近鄰演算法的模型複雜度體現在 什麼情況下會造成過擬合?答 模型複雜度體現在k上 k較小時,容易造成過擬合 k較大時,容易造成欠擬合。給定乙個二維空間的資料集t 試基於歐式距離,找到資料點s 5,3 的最近鄰 k 1 並對s點進行分類 import numpy as np import matp...
基於sklearn的感知機python3
首先,本文還是選用python裡面自帶的digits資料集 from sklearn.datasets import load digits digits load digits 資料標準化 from sklearn.preprocessing import standardscaler scale...