二元逻辑回归(logistic regression)
目錄
一,原理
二,python代碼
2.1 數(shù)據(jù)集的格式
2.2 代碼
三,適用條件
一,原理
回歸:
????????假設(shè)存在一些數(shù)據(jù)點(diǎn),用一條直線或者曲線或折現(xiàn)去擬合這些點(diǎn)就叫做回歸。也就是找出平面點(diǎn)上兩個(gè)軸變量之間的函數(shù)關(guān)系,或者其他坐標(biāo)系下的變量間關(guān)系。一句話就是:回歸就是依靠已有數(shù)據(jù)點(diǎn)去擬合函數(shù)關(guān)系。
? ? ? ? 常見的回歸有:線性回歸,非線性回歸,局部加權(quán)回歸……
邏輯回歸:回歸的目標(biāo)是一個(gè)二值結(jié)果(0和1),是一種常見的二元分類模型。本質(zhì)就是線性回歸與激活函數(shù)sigmoid的結(jié)合,與大腦神經(jīng)元工作方式類似,是入門機(jī)器學(xué)習(xí)的基礎(chǔ)。
應(yīng)用:對(duì)于一個(gè)具體的實(shí)際問題,我們可以得到他既有的一些數(shù)據(jù),那么就可以使用邏輯回歸對(duì)這些數(shù)據(jù)進(jìn)行特征處理學(xué)習(xí),讓計(jì)算機(jī)去尋找處數(shù)據(jù)之間的函數(shù)關(guān)系。當(dāng)我們得到新的數(shù)據(jù),就可以應(yīng)用計(jì)算機(jī)得到的函數(shù)關(guān)系去預(yù)測某些數(shù)據(jù)所產(chǎn)生的結(jié)果。
理論來源:
數(shù)學(xué)實(shí)現(xiàn):
????????線性回歸指的是多個(gè)y=ax+b這種的一元函數(shù)進(jìn)行累加,如下面所說的數(shù)據(jù)綜合體。由于需要進(jìn)行分類,使用sigmoid函數(shù)將連續(xù)的線性結(jié)果人為分為0和1兩種狀態(tài)。
sigmoid函數(shù):
? ? ? ? ?以0.5為界限。
使用數(shù)學(xué)來實(shí)現(xiàn)神經(jīng)元處理信息的過程:
前提:最終結(jié)果是0和1,表示兩種分類結(jié)果。w(數(shù)據(jù)權(quán)重)成了模型的參數(shù)。
第一步:定義損失函數(shù)
第二步:
求解L(w)的某一個(gè)w使其函數(shù)值最小,那么與實(shí)際結(jié)果數(shù)據(jù)就越吻合。
?第三步:
????????看這些符號(hào)已經(jīng)頭昏眼花。
第四步:程序?qū)崿F(xiàn)
二,python代碼
2.1 數(shù)據(jù)集的格式
? ? ? ? 命名為testset.txt,是一個(gè)N×3的形式。-0.017612與14.053064之間是一個(gè)tab的距離。
2.2 代碼
import numpy as np import matplotlib.pyplot as plt# 定義激活函數(shù)sigmoid def sigmoid(z):return 1.0 / (1 + np.exp(-z))# datas NxD # labs Nx1 # w Dx1# 權(quán)重更新 def weight_update(datas, labs, w, alpha=0.01):z = np.dot(datas, w) # Nx1,神經(jīng)元接受的數(shù)據(jù)綜合體,有N個(gè)數(shù)據(jù)h = sigmoid(z) # Nx1,激活函數(shù)的值,0-1之間,相對(duì)于預(yù)測值Error = labs - h # Nx1,預(yù)測值與實(shí)際值的誤差,Y-hw = w + alpha * np.dot(datas.T, Error)return w#進(jìn)行訓(xùn)練,求解參數(shù),非隨機(jī)梯度下降 def train_LR(datas, labs, n_epoch=2, alpha=0.005):N, D = np.shape(datas)# datas NxDw = np.ones([D, 1]) # Dx1,給權(quán)重賦初始值,都是1# 進(jìn)行n_epoch輪迭代for i in range(n_epoch):w = weight_update(datas, labs, w, alpha)error_rate = test_accuracy(datas, labs, w)#計(jì)算誤差率print("epoch %d error %.3f%%" % (i, error_rate * 100))return w# 隨機(jī)梯度下降,帶batchsize的,可以使更快的找到導(dǎo)數(shù)為0的點(diǎn),而不會(huì)在此左右徘徊,alpha也不能取太大,導(dǎo)致在導(dǎo)數(shù)為0的點(diǎn)處左右徘徊 def train_LR_batch(datas, labs, batchsize, n_epoch=2, alpha=0.005):N, D = np.shape(datas)# weight 初始化w = np.ones([D, 1]) # Dx1N_batch = N // batchsizefor i in range(n_epoch):# 數(shù)據(jù)打亂rand_index = np.random.permutation(N).tolist()# 每個(gè)batch 更新一下weightfor j in range(N_batch):# alpha = 4.0/(i+j+1) +0.01index = rand_index[j * batchsize:(j + 1) * batchsize]batch_datas = datas[index]batch_labs = labs[index]w = weight_update(batch_datas, batch_labs, w, alpha)error = test_accuracy(datas, labs, w)print("epoch %d 誤差率 %.2f%%" % (i, error * 100))return w# 測試精確性,與模型無關(guān),用于提醒展示效果,作用是計(jì)算誤差率 def test_accuracy(datas, labs, w):N, D = np.shape(datas)z = np.dot(datas, w) # Nx1h = sigmoid(z) # Nx1lab_det = (h > 0.5).astype(np.float)error_rate = np.sum(np.abs(labs - lab_det)) / Nreturn error_rate# 畫圖,直觀地表示出結(jié)果 def draw_desion_line(datas, labs, w, name="0.jpg"):dic_colors = {0: (.8, 0, 0), 1: (0, .8, 0)}# 畫數(shù)據(jù)點(diǎn)for i in range(2):index = np.where(labs == i)[0]sub_datas = datas[index]plt.scatter(sub_datas[:, 1], sub_datas[:, 2], s=16., color=dic_colors[i])# 畫判決線min_x = np.min(datas[:, 1])max_x = np.max(datas[:, 1])w = w[:, 0]x = np.arange(min_x, max_x, 0.01)y = -(x * w[1] + w[0]) / w[2]plt.plot(x, y)plt.savefig(name)#加載數(shù)據(jù)集進(jìn)行訓(xùn)練或者加載測試數(shù)據(jù)對(duì)模型進(jìn)行檢驗(yàn) def load_dataset(file):with open(file, "r", encoding="utf-8") as f:lines = f.read().splitlines()# 取 lab 維度為 N x 1labs = [line.split("\t")[-1] for line in lines]labs = np.array(labs).astype(np.float32)labs = np.expand_dims(labs, axis=-1) # Nx1# 取數(shù)據(jù) 增加 一維全是1的特征datas = [line.split("\t")[:-1] for line in lines]datas = np.array(datas).astype(np.float32)N, D = np.shape(datas)# 增加一個(gè)維度datas = np.c_[np.ones([N, 1]), datas]return datas, labsif __name__ == "__main__":# 加載數(shù)據(jù)file = "1.txt"datas, labs = load_dataset(file)weights = train_LR_batch(datas, labs,batchsize=2, alpha=0.001, n_epoch=800)print('w1是{},w2是{},b是{}'.format(weights[0][0],weights[1][0],weights[2][0]))#回歸直線就是w1x+w2y+b=0 draw_desion_line(datas, labs, weights, name="test_1.jpg")#將結(jié)果保存為jpg文件三,適用條件
? ? ? ? 多用于二維平面點(diǎn)集的分類,當(dāng)數(shù)據(jù)集維度過大,邏輯回歸的效果并不好,無法使交叉熵趨于0。
總結(jié)
以上是生活随笔為你收集整理的二元逻辑回归(logistic regression)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IRAT Iu Handover (UT
- 下一篇: 一阶电路的时域分析