python實現logistic分類演算法

2021-08-15 10:55:23 字數 3211 閱讀 2701

最近在看吳恩達的機器學習課程,自己用python實現了其中的logistic演算法,並用梯度下降獲取最優值。

logistic分類是乙個二分類問題,而我們的線性回歸函式

的取值在負無窮到正無窮之間,對於分類問題而言,我們希望假設函式的取值在0~1之間,因此logistic函式的假設函式需要改造一下

由上面的公式可以看出,0 < h(x) < 1,這樣,我們可以以1/2為分界線

cost function可以這樣定義

其中,m是樣本的數量,初始時θ可以隨機給定乙個初始值,算出乙個初始的j(θ)值,再執行梯度下降演算法迭代,直到達到最優值,我們知道,迭代的公式主要是每次減少乙個偏導量

如果將j(θ)代入化簡之後,我們發現可以得到和線性回歸相同的迭代函式

按照這個迭代函式不斷調整θ的值,直到兩次j(θ)的值差值不超過某個極小的值之後,即認為已經達到最優解,這其實只是乙個相對較優的解,並不是真正的最優解。 其中,α是學習速率,學習速率越大,就能越快達到最優解,但是學習速率過大可能會讓懲罰函式最終無法收斂,整個過程python的實現如下

import math

alpha = 0.3

diff = 0.00001

def predict(theta, data):

results =

for i in range(0, data.__len__()):

temp = 0

for j in range(1, theta.__len__()):

temp += theta[j] * data[i][j - 1]

temp = 1 / (1 + math.e ** (-1 * (temp + theta[0])))

return results

def training(training_data):

size = training_data.__len__()

dimension = training_data[0].__len__()

hxs =

theta =

for i in range(0, dimension):

initial = 0

for i in range(0, size):

hx = theta[0]

for j in range(1, dimension):

hx += theta[j] * training_data[i][j]

hx = 1 / (1 + math.e ** (-1 * hx))

initial += (-1 * (training_data[i][0] * math.log(hx) + (1 - training_data[i][0]) * math.log(1 - hx)))

initial /= size

iteration = initial

initial = 0

counts = 1

while abs(iteration - initial) > diff:

print("第", counts, "次迭代, diff=", abs(iteration - initial))

initial = iteration

gap = 0

for j in range(0, size):

gap += (hxs[j] - training_data[j][0])

theta[0] = theta[0] - alpha * gap / size

for i in range(1, dimension):

gap = 0

for j in range(0, size):

gap += (hxs[j] - training_data[j][0]) * training_data[j][i]

theta[i] = theta[i] - alpha * gap / size

for m in range(0, size):

hx = theta[0]

for j in range(1, dimension):

hx += theta[j] * training_data[i][j]

hx = 1 / (1 + math.e ** (-1 * hx))

hxs[i] = hx

iteration += -1 * (training_data[i][0] * math.log(hx) + (1 - training_data[i][0]) * math.log(1 - hx))

iteration /= size

counts += 1

print('training done,theta=', theta)

return theta

if __name__ == '__main__':

training_data = [[1, 1, 1, 1, 0, 0], [1, 1, 0, 1, 0, 0], [1, 0, 1, 0, 0, 0], [0, 0, 0, 0, 1, 1], [0, 1, 0, 0, 0, 1],

[0, 0, 0, 0, 1, 1]]

test_data = [[0, 1, 0, 0, 0], [0, 0, 0, 0, 1]]

theta = training(training_data)

res = predict(theta, test_data)

print(res)

執行結果如下

吳恩達深度學習 2 12向量化logistic回歸

1.不使用任何for迴圈用梯度下降實現整個訓練集的一步迭代。1 logistic回歸正向傳播的步驟 如果有m個訓練樣本,對乙個樣本進行 需要通過下面的方式計算出z值和啟用函式a值,然後用同樣的方法計算第二個和第三個樣本.以此類推,如果有m個樣本的話,這樣可能需要做上m次。可以看出,為了執行正向傳播的...

python實現線性回歸 python實現線性回歸

參考 機器學習實戰 machine learning in action 一 必備的包 一般而言,這幾個包是比較常見的 matplotlib,用於繪圖 numpy,陣列處理庫 pandas,強大的資料分析庫 sklearn,用於線性回歸的庫 scipy,提供很多有用的科學函式 我一般是用pip安裝,...

python爬蟲基礎實現 Python實現基礎爬蟲

初次使用urllib實現爬蟲的資料請求 urllib.request.urlopen url 發起get請求 urllib.parse.quote 將中文進行url編碼 from urllib.request importurlopen,urlretrieve,requestfrom urllib....