您的位置:首页 > 其它

梯度下降和逻辑回归

2017-04-20 18:22 197 查看

梯度下降法

梯度下降法是求解无约束最优化问题的一种最常用的方法,它是一种迭代算法,每一步需要求解目标函数的梯度向量。

梯度下降法算法:

输入:目标函数f(x),梯度函数g(x)=∇f(x),计算精度ε:f(x)的极小点x0

(1)取初始值x0∈Rn,置k=0

(2)计算f(x(k))

(3)计算梯度g(k)=g(x(k)),当∥gk<ε∥时,停止迭代,令x0=xk;否则,令pk=−g(x(k)),求λk,使f(x(k)+λkpk)=minλ≥0f(x(k)+λpk)

(4)置x(k+1)=x(k)+λkpk,计算f(x(k+1))

当∥∥f(x(k+1))−f(x(k))∥∥<ε或∥∥x(k+1)−x(k)∥∥<ε时,停止迭代,令x0=x(k+1)

(5)否则,置k=k+1,转(3)

但要注意,梯度下降法得到的解有时候未必是全局最优解。

逻辑回归

逻辑回归有二分类的,也有多分类的,但由于二分类比较常用,也容易理解,所以实际上应用的大多是二分类的逻辑回归。

在一个线性模型中,我们可以得到一系列连续的值,然而在一个二分类问题中,我们希望它输出0或者1,对此,引入一个新的模型,即逻辑模型来解决这个问题

hθ(x)=g(θTx)其中x代表特征向量,g是一个逻辑函数S形,公式为g(z)=11+e−z

该函数图像为



hθ(x)的作用,对于给定,根据选择的参数计算输出变量为1的可能性,即hθ(x)=P(y=1|x;θ)

接下来,调用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上的短信垃圾邮件收集数据集
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: