logistic回归 简介_逻辑回归推导和代码实现

1.逻辑回归简介

逻辑回归(logistic Regression)实际上是一种分类方法,主要用于二分类问题。 其函数形式为:

其函数图像为:

ce590bcd32d23c64676dd9361e90108d.png

将上述的参数z 延伸成向量形式, 令

。则有:

将向量w和x扩充一个维度,

,则

时,取
,当
时,取
。写成条件概率的形式为:

合并为:

上式即为损失函数。

对于一组数据:

对上式取对数:

= 上式

用极大似然估计 最大化

的值。

目标函数为:

对F(w)求导计算:

补充:

计算过程略

一旦有了包含所有偏导数的梯度向量就可以使用梯度下降算法对向量

进行求解了。

2 代码实现

数据集选用SKlearn库中的鸢尾花数据集,需要说明的是,这个数据集共有150朵鸢尾花,分别来自三个品种:Setosa鸢尾花、Versicolor鸢尾花和Virginica鸢尾花。数据里包含了花的萼片长度以及花瓣的长度和宽度等特征。

import 

4ff090e1530e4ea551646b327f2815bb.png
print(iris.DESCR)

0f9fcd46568b35905eb2ca4ff19418b7.png
X = iris["data"][:, 3:]  # petal width
y = (iris["target"] == 2).astype(np.int)  # 1 if Iris-Virginica, else 0
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(random_state=42)
log_reg.fit(X, y)

可视化处理:

X_new = np.linspace(0, 3, 1000).reshape(-1, 1)
y_proba = log_reg.predict_proba(X_new)
decision_boundary = X_new[y_proba[:, 1] >= 0.5][0]

plt.figure(figsize=(8, 3))
plt.plot(X[y==0], y[y==0], "bs")
plt.plot(X[y==1], y[y==1], "g^")
plt.plot([decision_boundary, decision_boundary], [-1, 2], "k:", linewidth=2)
plt.plot(X_new, y_proba[:, 1], "g-", linewidth=2, label="Iris-Virginica")
plt.plot(X_new, y_proba[:, 0], "b--", linewidth=2, label="Not Iris-Virginica")
plt.text(decision_boundary+0.02, 0.15, "Decision  boundary", fontsize=14, color="k", ha="center")
plt.arrow(decision_boundary, 0.08, -0.3, 0, head_width=0.05, head_length=0.1, fc='b', ec='b')
plt.arrow(decision_boundary, 0.92, 0.3, 0, head_width=0.05, head_length=0.1, fc='g', ec='g')
plt.xlabel("Petal width (cm)", fontsize=14)
plt.ylabel("Probability", fontsize=14)
plt.legend(loc="center left", fontsize=14)
plt.axis([0, 3, -0.02, 1.02])
save_fig("logistic_regression_plot")
plt.show()

e118de5024330b95624c54f94bdd3ed9.png

决策边界的值约为1.6156

下面针对Petal width 和Petal length 两个维度,并引入Softmax 进行多分类:

X = iris["data"][:, (2, 3)]  # petal length, petal width
y = iris["target"]

softmax_reg = LogisticRegression(multi_class="multinomial",solver="lbfgs", C=10, random_state=42)
softmax_reg.fit(X, y)
x0, x1 = np.meshgrid(
        np.linspace(0, 8, 500).reshape(-1, 1),
        np.linspace(0, 3.5, 200).reshape(-1, 1),
    )
X_new = np.c_[x0.ravel(), x1.ravel()]


y_proba = softmax_reg.predict_proba(X_new)
y_predict = softmax_reg.predict(X_new)

zz1 = y_proba[:, 1].reshape(x0.shape)
zz = y_predict.reshape(x0.shape)

plt.figure(figsize=(10, 4))
plt.plot(X[y==2, 0], X[y==2, 1], "g^", label="Iris-Virginica")
plt.plot(X[y==1, 0], X[y==1, 1], "bs", label="Iris-Versicolor")
plt.plot(X[y==0, 0], X[y==0, 1], "yo", label="Iris-Setosa")

from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])

plt.contourf(x0, x1, zz, cmap=custom_cmap, linewidth=5)
contour = plt.contour(x0, x1, zz1, cmap=plt.cm.brg)
plt.clabel(contour, inline=1, fontsize=12)
plt.xlabel("Petal length", fontsize=14)
plt.ylabel("Petal width", fontsize=14)
plt.legend(loc="center left", fontsize=14)
plt.axis([0, 7, 0, 3.5])
save_fig("softmax_regression_contour_plot")
plt.show()

62f429d079aa84e5b5d7cc346bc7dc4e.png

预测:

softmax_reg.predict([[5, 2]])

输出类别为2, softmax 结果为 6.33134077e-07, 5.75276067e-02, 9.42471760e-01.

所以下次碰到Petal Length为5cm,Petal width为2cm的鸢尾花,大概率属于Virginica鸢尾花。

概率带入Softmax 即可计算,大约为94%,计算过程略。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值