用python寫梯度下降演算法實現邏輯斯蒂回歸

2021-10-01 06:57:41 字數 2723 閱讀 6009

具體演算法步驟:

# 1.載入資料;資料預處理

iris = pd.read_csv(

"iris.csv"

)# iris資料集有三類, 這裡將第三列刪除,只使用第一類和第二類

iris = iris[

~iris[

'species'

].isin(

['virginica'])

]x = iris.iloc[:,

1:5]

y = iris.iloc[:,

5]# 將iris前兩類的名稱改為0和1

y = y.replace(

"setosa",0

)y = y.replace(

"versicolor",1

)# 將x轉化成(x_1, x_2, ..., x_n, 1)的格式

x['one']=

1x = x.iloc[1:

,:]y = y.iloc[1:

]# 到這,資料預處理就完成了!

# 2.邏輯斯蒂回歸演算法

defg

(w, x, y)

:return np.

sum(np.log(

1+ np.exp(np.dot(x, w)))

- np.multiply(np.dot(x, w)

, np.expand_dims(y, axis=1)

), axis=1)

class

logistic

(object):

def__init__

(self, x, y, w=np.zeros(x.shape[1]

)):# w = (w1, w2, ..., wn, b)

self.eta =

0.1 self.epsilon =

0.001

self.step =

0 self.x = x

self.w = w

self.y = y

defrun(self)

:while

true

: p = np.exp(np.dot(self.x, self.w))/

(1+ np.exp(np.dot(self.x, self.w)))

gradient_w = np.

sum(np.multiply(self.x, np.expand_dims(p-self.y, axis=1)

), axis=0)

gradient_w_norm = np.linalg.norm(gradient_w,

ord=2)

# l2範數,等價於np.sqrt(np.sum(gradient_w**2))

if gradient_w_norm < self.epsilon:

return self.w, self.step

else

: w2 = self.w - self.eta*gradient_w

if np.linalg.norm(g(w2, self.x, self.y)

-g(self.w, self.x, self.y)

,ord=2

)< self.epsilon or \

np.linalg.norm(w2-self.w,

ord=2)

< self.epsilon:

return self.w, self.step

self.w = w2

self.step +=

1# 測試

deftest

(w, x)

: p_0 =1/

(1+np.exp(np.dot(x, np.expand_dims(w, axis=1)

))) p_1 =

1- p_0

diff = p_0 - p_1

diff[diff >0]

=0diff[diff <0]

=1return diff

log = logistic(x=x, y=y)

train_w, train_step = log.run(

)# train_w即為訓練得到的權重,train_step為訓練的步數

print

(train_w)

print

("步數:"

, train_step)

test_cls = test(train_w, x)

# test_cls即為logistic的判斷結果

# print(test_cls)

# 計算準確率

acc = np.

sum(test_cls - np.expand_dims(y, axis=1)

==0)/test_cls.shape[0]

print

("準確率:%.3f%%"

%(acc*

100)

)

梯度下降演算法 隨機梯度下降演算法scala實現

梯度下降和隨機梯度下降是機器學習中最常用的演算法之一。關於其具體的原理這裡不多做介紹,網路上可以很方便的找到。例如可以參考部落格 scala 實現如下 object sgd errorsum y row rowsum for col 0 until x 0 length loss 0.0 for r...

用Python實現梯度下降演算法

梯度下降實際就是導數值下降 梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost 接下來用python實現最土的梯度下降演算法,首先引入numpy模組和圖形介面模組 import matplotlib.pyplot as plt import numpy as np 定義三個函式 乙個數目標函...

用python編寫梯度下降演算法

這次我選的python版本是2.7,因為我之前用python3試了幾次,發現在畫3d圖的時候會報錯,我暫時還沒找到解決辦法,所以改用了2.7。資料集我選了乙個包含兩個變數,三個引數的資料集,這樣可以畫出3d圖形對結果進行驗證。symbols 函式 首先要安裝sympy庫才可以使用。用法 x1 sym...