Logistic回归——二分类 —— matlab

目录

1.简介

2.应用范围

3.分类

3.应用条件

4.原理详解

4.1 sigmod分类函数

4.2 建立目标函数

4.3 求解相关参数

5.实列分析

5.1 读取数据(excel文件)

5.2 分离数据集

5.3 求解前设定

5.4 求解目标函数

5.5 预测

5.6 预测分类

5.7 准确率

6.matlab自带函数


1.简介

Logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘 ,Logistic回归虽说是回归,但实际更属于判别分析。

2.应用范围

① 适用于流行病学资料的危险因素分析

② 实验室中药物的剂量-反应关系

③ 临床试验评价

④ 疾病的预后因素分析

3.分类

①按因变量的资料类型分:

二分类

多分类

其中二分较为常用

② 按研究方法分:

条 件Logistic回归

非条件Logistic回归

两者针对的资料类型不一样,前者针对配对研究,后者针对成组研究。

3.应用条件

① 独立性。各观测对象间是相互独立的;

② LogitP与自变量是线性关系;

③ 样本量。经验值是病例对照各50例以上或为自变量的5-10倍(以10倍为宜),不过随着统计技术和软件的发展,样本量较小或不能进行似然估计的情况下可采用精确logistic回归分析,此时要求分析变量不能太多,且变量分类不能太多;

④ 当队列资料进行logistic回归分析时,观察时间应该相同,否则需考虑观察时间的影响(建议用Poisson回归)。

4.原理详解

4.1 sigmod分类函数

之所以在这里介绍,是因为下面会用到这个函数

Sigmoid函数

\large h_{w}=\frac{1}{1+e^{-z}}

曲线表示:

由图可见当范围为0-1,当X<0时,Y趋向于0,X>0时,Y趋向于1,适合用于0-1二分类。

所以我们就可以设分类函数如下:

\large h_{w}=\frac{1}{1+e^{-z}}

\large z=\omega ^{T}x

\large x=\begin{bmatrix} 1,x_{1},x_{2},...,x_{n}\end{bmatrix}

\large z=w_{0}+w_{1}x_{1}+...+w_{n}x_{n}

        其中x为自变量,即特征数据。实际因变量为y,为0-1变量,h_w为预测值范围为0-1。显然这个模型需要求解的变量为w

4.2 建立目标函数

对于输入变量x,设h_w(x)为输出为1的概率,则1-h_w(x)为输出0的概率。则可表示成如下:

\large p(y=1|x;w)=h_{w}(x)

\large p(y=0|x;w)=1-h_{w}(x)

求解损失函数:用概率论中的极大似然估计的方法,构建概率函数如下,

\large P(y|x;w)=(h_{w}(x))^{y}*(1-h_{w}(x))^{1-y}

        对损失函数可以理解为,当y=1时,h_w(x)的值越大,P的值越大;y=0时,h_w(x)的值越小,P的值越小。即可以认为,当P值越大时预测的越准确。单个输入的目标即为P取最大。对M个输入样本,可以构建以下目标函数:

\large L(w)=\prod_{i=1}^{m}(h_{w}(x))^{y^{(i)}}*(1-h_{w}(x))^{1-y^{(i)}}

        对目标函数取对数可以将目标函数的连乘变为连加:

\large log(L(w))=\sum_{i=1}^{m}y^{(i)}h_{w}(x^{(i)})+(1-y^{(i)})(1-h_{w}(x^{(i)}))

4.3 求解相关参数

        设J(w)=log(L(w)),求J(w)的最大值,可以用梯度上升的方法进行求解,如果在前面加上一个负号,则就转化为梯度下降。在这里用梯度上升法求解系数 \large w :

\large w^{'}=w+\eta \triangledown J(w)

 其中,\large \eta为学习率。\triangledown J(w)对目标函数求梯度、即求导。

                              \large \eta \triangledown J(w)^{(i)}=\frac{\partial J(w)^{(i)} }{\partial w}

                                                    \large =[\frac{y^{(i)}}{h_{w}(x^{(i)})}+\frac{1-y^{(i)}}{1-{h_{w}(x^{(i)})}}]\frac{\partial h_{w}(x^{(i)}) }{\partial w}

                                                    \large =[\frac{y^{(i)}-h_{w}(x^{(i)}}{h_{w}(x^{(i)})(1-{h_{w}(x^{(i)})})}]\frac{\partial h_{w}(x^{(i)}) }{\partial w}

其中:

\large \frac{\partial h_{w}(x^{(i)}) }{\partial w}=(\frac{1}{1+e^{-w^{T}x^{(i)}}})^{'}=\frac{x^{(i)}e^{-w^{T}x^{(i)}}}{(1+e^{-w^{T}x^{(i)}})^{2}}

                                                     \large =x[\frac{1}{1+e^{-w^{T}x^{(i)}}}\times \frac{e^{-w^{T}x^{(i)}}}{1+e^{-w^{T}x^{(i)}}}]

                                                     \large =x[h_{w}(x^{(i)})(1-h_{w}(x^{(i)}))]

将其带入原式可得:

\large \triangledown J(w)^{(i)}=x^{(i)}[y^{(i)}-h_{w}(x^{(i)})]

 \large \triangledown J(w)=\sum_{i=1}^{m}x^{(i)}[y^{(i)}-h_{w}(x^{(i)})]

5.实列分析

相关数据如下:

fbsrestecgthalachexang0ldpeaksl0pecathaltarget
01168012230
1015513.10030
0112512.60030
01161002130
1110601.91320
00122011021
0214004.40310
0014510.81130
0014400.82030
0011613.21220
0112501.61021
10136131030

5.1 读取数据(excel文件)

data=xlsread('D:\桌面\data.xlsx')

返回:发现数据直接从不是标题的第一行开始读取了

5.2 分离数据集

正式介绍之前补充一点东西

        行数 = size(data,1)

        列数 = size(data,2)

好,开始进入正题

此为通过比例确定,选择多少行数据作为测试集

num=round(0.8*size(data,1));%取整个数据0.8的比例训练

此为,选出相应比例的数据作为测试集

train_data=data(1:num,:)

此为,将剩余数据作为验证集

test_data=data(num+1:end,:)

分离测试集的x和y

n=size(data,2)
train_y=train_data(:,n); %确定y所对应的数据
train_x=train_data(:,1:n-1); %除去y将剩余的数据都归于x

同理分离验证集的x和y

test_y=test_data(:,n); 
test_x=test_data(:,1:n-1);

5.3 求解前设定

详看上面过程公式4.1的分类函数的解析

train_x1=[ones(size(train_x,1),1),train_x];%在基础上增加常数项
test_x1=[ones(size(test_x,1),1),test_x];
w=zeros(size(train_x1,2),1);
lr=0.001;%学习率

5.4 求解目标函数

pred_f=  train_x1*w;  %预测出的方程式取值
pred_y=1./(1+exp(-pred_f)); %Sigmoid函数
d_w=(train_y-pred_y)'*train_x1;
w=w+lr*d_w';

返回:

5.5 预测

pred_y=1./(1+exp(-test_x1*w)) %%Sigmoid函数预测出的y

返回:

5.6 预测分类

fenlei=(pred_y>=0.5)

返回:

5.7 准确率

accu=1-sum(abs(fenlei-test_y))./length(test_y)

返回:

我们用预测的和原始数据对比一下,确实是只对了一个

6.matlab自带函数

fitglm 

官方文档:Create generalized linear regression model - MATLAB fitglm- MathWorks 中国

Create generalized linear regression model 创建广义线性回归模型

mdl = fitglm(x,y,'distribution','binomal')  构建二项式 logistic模型

接下来我们再对上述数据进行拟合

数据集划分部分就不重复了

GM= fitglm(x,y);
y_p = predict(GM,x_t);
fenlei=(y_p>=0.5)
accu=1-sum(abs(fenlei-y_t))./length(y_p)

返回:

可以发现和上面结果一致。

线性回归结果分析:

1.  回归系数置信区间应不包含零点

2.  stats统计量:

1)R^{2} :   R^{2} 的值越接近 1,变量的线性相关性越强,

2)F :    当 F > F1-α(m,n-m-1) ,即认为因变量 y 与自变量 x1,x2,...,xm 之间有显著的线性相关关系;

                否则认为因变量 y 与自变量 x1,x2,...,xm 之间线性相关关系不显著。

3)p :   若 p < α(α 为预定显著水平),则说明因变量 y 与自变量 x1,x2,...,xm之间显著地有线性相关关系。

4)s^{2}      主要用来比较模型是否有改进,其值越小说明模型精度越高。

本次就到这里了,如果有错误的话及时联系我进行改正哦,谢谢。

  • 12
    点赞
  • 172
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,下面是关于在乳腺癌数据集上应用Logistic回归进行预测和分析的Python代码: 首先,我们需要导入所需的库和数据集: ```python import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix cancer = load_breast_cancer() df = pd.DataFrame(np.c_[cancer['data'], cancer['target']], columns = np.append(cancer['feature_names'], ['target'])) ``` 然后,我们需要将数据集分成训练集和测试集: ```python X = df.iloc[:, :-1].values y = df.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) ``` 接下来,我们可以使用Logistic回归模型进行训练和预测: ```python model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) ``` 最后,我们可以使用准确率和混淆矩阵来评估模型的性能: ```python print("Accuracy:", accuracy_score(y_test, y_pred)) print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred)) ``` 完整的代码如下所示: ```python import pandas as pd import numpy as np from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, confusion_matrix cancer = load_breast_cancer() df = pd.DataFrame(np.c_[cancer['data'], cancer['target']], columns = np.append(cancer['feature_names'], ['target'])) X = df.iloc[:, :-1].values y = df.iloc[:, -1].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) print("Accuracy:", accuracy_score(y_test, y_pred)) print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值