logistic迴歸git
不少時候咱們須要基於一些樣本數據去預測某個事件是否發生,如預測某事件成功與失敗,某人當選總統是否成功等。github
這個時候咱們但願獲得的結果是 bool型的,即 true or false算法
咱們最早想到的是經過最小二乘法求出線性迴歸模型,app
即 Y = WTX = w0x0 + w1x1 + w2x2 + ... + wnxn dom
X表示自變量向量,能夠經過隨機梯度算法求出上述的係數向量W函數
此時Y表示線性迴歸的預測值。測試
這時存在的問題是:spa
Y表示的是預測值,可是其可正,可負,能夠很大,能夠很小,咱們沒法經過Y得出二進制的結果code
爲了解決上面的問題,咱們能夠大膽假設該事件發生的機率的p且 logit(p) = Yorm
logit(p) 是一個統計學上的模型
由logit (p ) = Y求得
畫圖以下:
咱們能夠看出,對於任意的Y值,假設的機率值p都分佈在[0,1]之間
這樣咱們能夠規定任何p大於0.5的數據被分入1類,小於0.5被納入0類,從而獲得bool型的結果
事實證實,上述的logit(p) 模型,在處理這種二分類預測中很是有用
這即是logistic迴歸
用logistic迴歸預測實例
數據集來源: http://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival
數據集說明:
該數據集包含了1958年-1970年在芝加哥大學的比林斯醫院接受過乳房癌症手術的病人的存活率。數據集樣例以下:
X1: 手術時病人年齡
X2: 患者手術年(年- 1900年)
X3: 檢測陽性腋窩淋巴結數目(數值)
X4: 生存狀態(class屬性)1--患者活了5年或更長 , 0---病人在5年內死亡。
求當一個病人的數據爲[X1,X2,X3] = [34,66,9]時咱們能夠經過logistic迴歸預測病人手術後是否有可能活過5年?
代碼
1 # -*- coding:utf-8 -*- 2 import numpy as np 3 4 def load_data(file_name): 5 # 載入數據 6 data_mat = [] 7 labels = [] 8 9 with open(file_name) as file: 10 for line in file.readlines(): 11 line_arr = line.strip().split(',') 12 data_mat.append([float(line_arr[0]), float(line_arr[1]), float(line_arr[2])]) 13 labels.append(int(line_arr[3])) 14 return data_mat, labels 15 16 17 def sigmoid(x): 18 # 階躍函數 19 if -x > np.log(np.finfo(type(x)).max): 20 return 0.0 21 else: 22 return 1.0 / (1 + np.exp(-x)) 23 24 25 def grad_ascent(data_mat, data_labels, num_iter=200): 26 """隨機梯度上升算法""" 27 data_mat = np.array(data_mat) 28 m, n = np.shape(data_mat) 29 30 weights = np.ones(n).astype(np.float) 31 for j in range(num_iter): 32 data_index = list(range(m)) 33 for i in range(m): 34 alpha = 0.001 + 4 / (1.0 + j + i) 35 36 random_index = int(np.random.uniform(0, len(data_index))) 37 h = sigmoid(sum(data_mat[random_index] * weights)) 38 error = data_labels[random_index] - h 39 weights = weights + alpha * error * data_mat[random_index] 40 del (data_index[random_index]) 41 42 return weights 43 44 45 def test(x, name): 46 file_name = name 47 data_mat, labels = load_data(file_name) 48 weights = grad_ascent(data_mat, labels) 49 print(weights) 50 res = classify_vector(x, weights) 51 print(res) 52 53 54 def classify_vector(inx, weights): 55 prob = sigmoid(sum(inx * weights)) 56 if prob > 0.5: 57 return 1.0 58 else: 59 return 0.0 60 61 62 name = 'data/haberman.txt' 63 test([72, 63, 0], name)
執行結果爲 0
說明改病人極可能術後活不過5年。
以上只是logistic 迴歸的一個簡單測試,全部代碼已上傳 https://github.com/beiyan1911/machine_learning/tree/master/logistic_reg