梯度下降法
梯度下降法是求解无约束最优化问题的一种最常用的方法,它是一种迭代算法,每一步需要求解目标函数的梯度向量。
梯度下降法算法:
输入:目标函数
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
x0∈Rn,置k=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
<
ε
∥
\left\| {{g_k} < \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
)
)
∥
<
ε
或
∥
x
(
k
+
1
)
−
x
(
k
)
∥
<
ε
时
,
停
止
迭
代
,
令
x
0
=
x
(
k
+
1
)
\left\| {f({x^{(k + 1)}}) - f({x^{(k)}})} \right\| < \varepsilon 或\left\| {{x^{(k + 1)}} - {x^{(k)}}} \right\| < \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)其中x代表特征向量,g是一个逻辑函数S形,公式为g(z)=1+e−z1
该函数图像为
h
θ
(
x
)
的
作
用
,
对
于
给
定
,
根
据
选
择
的
参
数
计
算
输
出
变
量
为
1
的
可
能
性
,
即
h
θ
(
x
)
=
P
(
y
=
1
∣
x
;
θ
)
{h_\theta }(x)的作用,对于给定,根据选择的参数计算输出变量为1的可能性,即{h_\theta }(x) = P(y = 1|x;\theta )
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上的短信垃圾邮件收集数据集