机器学习--Logistic回归

logistic回归git

不少时候咱们须要基于一些样本数据去预测某个事件是否发生,如预测某事件成功与失败,某人当选总统是否成功等。github

这个时候咱们但愿获得的结果是 bool型的,即 true or false算法

咱们最早想到的是经过最小二乘法求出线性回归模型,app

即 Y = WTX  = w0x+  w1x+  w2x+ ...  +  wnx 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

相关文章
相关标签/搜索