具體演算法步驟:
# 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為訓練的步數
(train_w)
("步數:"
, 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]
("準確率:%.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...