700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 《统计学习方法》——逻辑斯蒂回归

《统计学习方法》——逻辑斯蒂回归

时间:2019-12-16 10:38:26

相关推荐

《统计学习方法》——逻辑斯蒂回归

逻辑斯蒂回归模型

定义6.1(逻辑斯蒂分布):设X是连续随机变量,X服从逻辑斯蒂分布是指X具有下列分布函数和密度函数:

式中,为位置参数,为形状参数。

二项逻辑斯蒂回归模型

定义6.2(逻辑斯蒂回归模型):二项逻辑斯蒂回归模型是如下的条件概率分布:

有时为了方便,将权值向量和输入向量加以扩充,仍记作w,x,即,。这时,逻辑斯蒂回归模型如下:

考察逻辑斯蒂回归模型的特点。一个事件的几率是指该事件发生的概率与该时间不发生的概率的比值。如果事件发生的概率是p,那么该事件发生的几率是,该事件的对数几率或logit函数是:

对逻辑斯蒂回归而言,

即在逻辑斯蒂回归模型中,输出Y=1的对数几率是输入x的线性函数。

换一个角度看,考虑对输入x进行分类的线性函数,其值域为实数域。注意,这里,。通过逻辑斯蒂回归模型定义可以将线性函数转换为概率:

这时,线性函数的值越接近正无穷,概率值就越接近1;线性函数的值越接近负无穷,概率值就越接近0.

模型参数估计

逻辑斯蒂回归模型学习时,对于给定的训练数据集,其中,,,可以应用极大似然估计法估计模型参数,从而得到逻辑斯蒂回归模型。

设:

似然函数为:

对数似然函数为:

对L(w)求极大值,得到w的估计值。

具体可参考:

对数几率回归(Logistic Regression)

deeplearning.ai深度学习——构建一个LR分类器来识别猫

多项逻辑斯蒂回归

假设离散型随机变量Y的取值集合是,那么多项逻辑斯蒂回归模型是:

这里,,

练习

已知训练数据集D,其正实例点(Y=1)是,负实例点(Y=0)是。

(1)用python自编程实现逻辑斯蒂回归模型,并对点进行分类。

# coding:utf-8"""@author:hanmy@file:lr.py@time:/05/17"""import numpy as npdef sigmoid(z):s = 1 / (1 + np.exp(-z))return s# 初始化参数def initialize(X, Y):w = np.zeros(shape=(X.shape[1], Y.shape[1])) # (3,1)b = 0return w, b# 前向和反向传播def propagate(w, b, X, Y):Y_hat = sigmoid(np.dot(np.transpose(w), np.transpose(X)) + b)cost = -np.mean(Y * np.log(Y_hat) + (1 - Y) * np.log(1 - Y_hat))m = len(X)dw = np.dot(np.transpose(X), np.transpose(Y_hat - Y)) / mdb = np.mean(Y_hat - Y)return dw, db, cost# 梯度下降法优化参数def optimize(w, b, X, Y, iterations, alpha):for i in range(iterations):dw, db, cost = propagate(w, b, X, Y)w -= alpha * dwb -= alpha * dbif i % 10000 == 0:print("{0} steps' cost:{1}".format(i, cost))return w, b# 预测待分类点def predict(w, b, X):m = len(X)Y_predition = np.zeros(shape=(1, m))Y_hat = sigmoid(np.dot(np.transpose(w), np.transpose(X)) + b)for i in range(Y_hat.shape[1]):if Y_hat[0][i] <= 0.5:Y_predition[0][i] = 0else:Y_predition[0][i] = 1return Y_preditionif __name__ == "__main__":X = np.array([[3, 3, 3],[4, 3, 2],[2, 1, 2],[1, 1, 1],[-1, 0, 1],[2, -2, 1]]) # (6,3)Y = np.array([[1, 1, 1, 0, 0, 0]]) # (1,6)test = np.array([[1, 2, -2]])iterations = 100000alpha = 0.01w, b = initialize(X, Y)w, b = optimize(w, b, X, Y, iterations, alpha)Y_prediction = predict(w, b, X)accuracy = 0for i in range(Y.shape[1]):if Y[0][i] == Y_prediction[0][i]:accuracy += 1accuracy /= Y.shape[1]print("训练集上的准确率:", accuracy)y_prediction = predict(w, b, test)print("测试点的预测分类为:Y =", np.squeeze(y_prediction).astype(np.int))

训练过程和预测结果为:

0 steps' cost:0.6931471805599451

10000 steps' cost:0.10335421644003383

20000 steps' cost:0.061108258043039126

30000 steps' cost:0.0426798495066772

40000 steps' cost:0.03255867460823466

50000 steps' cost:0.026223448952461724

60000 steps' cost:0.021907564790076998

70000 steps' cost:0.018788058230208335

80000 steps' cost:0.016432734621430706

90000 steps' cost:0.014593908080620305

训练集上的准确率: 1.0

测试点的预测分类为:Y = 0

(2)试调用sklearn.linear_model的LogisticRegression模块,对点进行分类,尝试改变参数,选择不同算法,如梯度下降法和拟牛顿法。

LogisticRegression(penalty='l2', dual=False, tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1, class_weight=None, random_state=None, solver='warn', max_iter=100, multi_class='warn', verbose=0, warm_start=False, n_jobs=None)

# coding:utf-8"""@author:hanmy@file:lr_sklearn.py@time:/05/17"""from sklearn.linear_model import LogisticRegressionimport numpy as npif __name__=="__main__":# 训练数据集X_train = np.array([[3, 3, 3],[4, 3, 2],[2, 1, 2],[1, 1, 1],[-1, 0, 1],[2, -2, 1]])y_train = np.array([1, 1, 1, 0, 0, 0])# 选择不同solver,构建实例,进行训练、测试methods = ["liblinear", "newton-cg", "lbfgs", "sag", "saga"]res = []X_new = np.array([[1, 2, -2]])for method in methods:clf = LogisticRegression(solver=method, intercept_scaling=2, max_iter=1000)clf.fit(X_train, y_train)# 预测新数据y_predict = clf.predict(X_new)# 利用已有数据对训练模型进行评价X_test = X_trainy_test = y_traincorrect_rate = clf.score(X_test, y_test)res.append((y_predict, correct_rate))# 格式化输出methods = ["liblinear", "newton-cg", "lbfgs", "sag", "saga"]print("solver选择:{}".format(" ".join(method for method in methods)))print("{}被分类为:{}".format(X_new[0], " ".join(str(re[0]) for re in res)))print("测试{}组数据,正确率:{}".format(X_train.shape[0], " ".join(str(round(re[1], 1)) for re in res)))

输出结果为:

solver选择:liblinear newton-cg lbfgs sag saga

[ 1 2 -2]被分类为:[0] [0] [0] [0] [0]

测试6组数据,正确率:1.0 1.0 1.0 1.0 1.0

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。