梯度下降和逻辑回归

梯度下降法

梯度下降法是求解无约束最优化问题的一种最常用的方法,它是一种迭代算法,每一步需要求解目标函数的梯度向量。
梯度下降法算法:
输入:目标函数 f ( x ) , 梯 度 函 数 g ( x ) = ∇ f ( x ) , 计 算 精 度 ε : f ( x ) 的 极 小 点 x 0 f(x),梯度函数g(x) = \nabla f(x),计算精度\varepsilon :f(x)的极小点{x_0} f(x)g(x)=f(x)εf(x)x0
(1)取初始值 x 0 ∈ R n , 置 k = 0 {x_0} \in {R^n},置k=0 x0Rnk=0
(2)计算 f ( x ( k ) ) f({x^{(k)}}) f(x(k))
(3)计算梯度 g ( k ) = g ( x ( k ) ) g(k) = g({x^{(k)}}) g(k)=g(x(k)),当 ∥ g k &lt; ε ∥ \left\| {{g_k} &lt; \varepsilon } \right\| gk<ε时,停止迭代,令 x 0 = x k {x_0} = {x_k} x0=xk;否则,令 p k = − g ( x ( k ) ) {p_k} = - g({x^{(k)}}) pk=g(x(k)),求 λ k {\lambda _k} λk,使$ f({x^{(k)}} + {\lambda k}{p_k}) = \mathop {\min }\limits{\lambda \ge 0} f({x^{(k)}} + \lambda {p_k})$
(4)置 x ( k + 1 ) = x ( k ) + λ k p k {x^{(k + 1)}} = {x^{(k)}} + {\lambda _k}{p_k} x(k+1)=x(k)+λkpk,计算 f ( x ( k + 1 ) ) f({x^{(k + 1)}}) f(x(k+1))
∥ f ( x ( k + 1 ) ) − f ( x ( k ) ) ∥ &lt; ε 或 ∥ x ( k + 1 ) − x ( k ) ∥ &lt; ε 时 , 停 止 迭 代 , 令 x 0 = x ( k + 1 ) \left\| {f({x^{(k + 1)}}) - f({x^{(k)}})} \right\| &lt; \varepsilon 或\left\| {{x^{(k + 1)}} - {x^{(k)}}} \right\| &lt; \varepsilon 时,停止迭代,令{x_0} = {x^{(k + 1)}} f(x(k+1))f(x(k))<εx(k+1)x(k)<εx0=x(k+1)
(5)否则,置 k = k + 1 k = k + 1 k=k+1,转(3)
但要注意,梯度下降法得到的解有时候未必是全局最优解。

逻辑回归

逻辑回归有二分类的,也有多分类的,但由于二分类比较常用,也容易理解,所以实际上应用的大多是二分类的逻辑回归。
在一个线性模型中,我们可以得到一系列连续的值,然而在一个二分类问题中,我们希望它输出0或者1,对此,引入一个新的模型,即逻辑模型来解决这个问题
h θ ( x ) = g ( θ T x ) 其 中 x 代 表 特 征 向 量 , g 是 一 个 逻 辑 函 数 S 形 , 公 式 为 g ( z ) = 1 1 + e − z {h_\theta }(x) = g({\theta ^T}x) 其中x代表特征向量,g是一个逻辑函数S形,公式为g(z) = \frac{1}{{1 + {e^{ - z}}}} hθ(x)=g(θTx)xgSg(z)=1+ez1
该函数图像为
S函数
h θ ( x ) 的 作 用 , 对 于 给 定 , 根 据 选 择 的 参 数 计 算 输 出 变 量 为 1 的 可 能 性 , 即 h θ ( x ) = P ( y = 1 ∣ x ; θ ) {h_\theta }(x)的作用,对于给定,根据选择的参数计算输出变量为1的可能性,即{h_\theta }(x) = P(y = 1|x;\theta ) hθ(x)1hθ(x)=P(y=1x;θ)
接下来,调用python中sklearn的库来完成逻辑回归的分类

# -*- coding: utf-8 -*-
"""
Created on Thu Apr 20 16:00:35 2017

@author: Mosang
"""

import matplotlib.pyplot as plt
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model.logistic import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix

df = pd.read_csv('D:/spam.csv', encoding='latin-1')
#print(df.head())
df = df.drop(['Unnamed: 2','Unnamed: 3','Unnamed: 4'],axis=1)
df = df.rename(columns = {'v1':'label','v2':'message'})
df.groupby('label').describe()
df['length'] = df['message'].apply(len)
#print(df.head())

features_train_raw, features_test_raw, labels_train, labels_test = train_test_split(
        df.iloc[:,1], df.iloc[:,0], test_size=0.3, random_state=0)
vectorizer = TfidfVectorizer()
features_train = vectorizer.fit_transform(features_train_raw)
features_test = vectorizer.transform(features_test_raw)

classifier = LogisticRegression()
classifier.fit(features_train, labels_train)
predictions = classifier.predict(features_test)

print (accuracy_score(labels_test, predictions))

confusion_matrix = confusion_matrix(labels_test, predictions)
print(confusion_matrix)
plt.matshow(confusion_matrix)
plt.title('混淆矩阵', fontproperties = 'SimHei')
plt.colorbar()
plt.ylabel('实际类型', fontproperties = 'SimHei')
plt.xlabel('预测类型', fontproperties = 'SimHei')
plt.show()

预测之后的精度约等于0.965,而画出来的混淆矩阵为

参考:
1.Mastering Machine Learning With scikit-learn
2.统计学习方法
3.机器学习个人笔记
4.数据集来自kaggle上的短信垃圾邮件收集数据集

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值