一、Sigmoid/Logistic函数:
我们定义逻辑回归的预测函数为ℎ𝜃(𝑥) = 𝑔(𝜃𝑇𝑥) ,
其中g(x)函数是sigmoid函数。
注意此处𝜃,x都是列向量;
二、决策边界:
1、𝜃 = [-3; 1; 1] x = [0; x1; x2]
2、𝜃 = [-1; 0; 0; 1; 1] x = [0; x1; x2; x12; x22]
3、这是更复杂的逻辑边界:
三、逻辑回归的代价函数:
1、其中y代表真实值,ℎ𝜃(𝑥)代表预测值;该代价函数也是一个凸函数,故而可以利用梯度下降法求解全局最小值
或者简化为如下形式:
𝐶𝑜𝑠𝑡(ℎ𝜃(𝑥), 𝑦) = −𝑦𝑙𝑜𝑔(ℎ𝜃(𝑥)) − (1−𝑦)𝑙𝑜𝑔(1−ℎ𝜃(𝑥))
2、代价函数的导数:
3、梯度下降法的伪代码描述:
四、多分类问题:
通过划定不止一个决策边界:
五、正确率/召回率/F1指标:
1、定义:
正确率:就是检索出来的条目有多少是正确的;
召回率:就是所有正确的条目有多少被检索出来了。
F1值=2∗(正确率∗召回率)/(正确率+召回率)。 是综合上面二个指标的评估指标。
这几个指标的取值都在0-1之间,数值越接近于1,效果越好。
2、分析:
我们希望检索结果Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。
比如极端情况下,我们只搜索出了一个结果,且是准确的,那么Precision就是100%,但是Recall就很低;
而如果我们把所有结果都返回,那么比如Recall是100%,但是Precision就会很低。
六、代码展示:
相关代码
my_first_logistic_linear.py:
import matplotlib.pyplot as plt
import numpy as np
#用来评估模型性能
from sklearn.metrics import classification_report
from sklearn import preprocessing
#是否对数据进行标准化处理
scale = True
#载入数据:
data = np.genfromtxt("LR-testSet.csv",delimiter=",")
x_data = data[:,:-1]
#给x_data添加偏置项,即线性逻辑回归中的截距
#np.concatenate(a,b)的功能是对矩阵进行扩充
#axis=0是沿Y轴进行扩充,b放置在A的下面
#axis=1是沿X轴进行扩充
x_data = np.concatenate((np.ones((100,1)), x_data), axis=1)
#赋予y_data的Y轴多一个维度,方便接下来的np.mat命令:
y_data = data[:,-1, np.newaxis]
#定义sigmod函数
def sigmod(x):
return 1.0/(1+np.exp(-x))
#定义代价函数
#这里Mat的意思是都已经是np中的矩阵模式
def cost(xMat, yMat, theta):
#np.multiply(a,b)会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同),并返回一个新的numpy数组
#如果shape不同的话,会将小规格的矩阵延展成与另一矩阵一样大小,再求两者内积(不建议这样用)
#此处要求theta是一个列向量,保证xMat*theta是一个单值
left = np.multiply(yMat, np.log(sigmod(xMat*theta)))
right = np.multiply(1-yMat, np.log(1-sigmod(xMat*theta)))
#sum()中axis默认为0,即沿Y轴方向求和;
#len()中axis默认也为0,即沿Y轴方向求长度;
return np.sum(left + right) / -(