感知機自程式設計與sklearn實現

2022-06-22 04:54:13 字數 3108 閱讀 8731

對於下面題目,分別用自程式設計和 sklearn 庫實現。

已知訓練資料集d,其正例項點是x1=(3,3)t,x2=(4,3)t,負例項點是x3=(1,1)t:

(1) 用python 自程式設計實現感知機模型,對訓練資料集進行分類,並對比誤分類點選擇次序不同對最終結果的影響。可採用函式式程式設計或物件導向的程式設計。

(2)試呼叫sklearn.linear_model 的perceptron模組,對訓練資料集進行分類,並對比不同學習率h對模型學習速度及結果的影響。

參考preceptron.py

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...