一.线性模型
1.基本形式
给定由d个属性的示例x=(x1;x2;x3;...;xd),其中xi是x再第i个属性上的取值,线性模型函数f(x)=w1x1+w2x2+....+wdxd+b,用向量的形式写出f(x) = wTx+b,中w=(w1, w2, ..., wd)为待求解系数
听着会很抽象,举个例子吧
比如在西瓜问题学习中学得"f好瓜(x) = 0.2*x色泽 + 0.5*x根蒂 + 0.3*x敲声 + 1",则意味着可以通过综合考虑色泽,根蒂,和敲声来判断西瓜好不好,其中根蒂最要紧,敲声比色泽更重要
2.线性回归
表示试图学得一个线性模型以尽可能准确得预测实值输出标志。
即f(xi) = wxi+b,使得f(xi) ≈ yi
求出 w和b所需方法为最小二乘法
分别对w和b进行求导,得到最优解得闭式,
根据周志华老师所说,这俩个参数得计算是机器学习得入门,如果不懂得计算,那机器学习就很困难了。(加油)
上述我们称之为“多元线性回归”
同样,我们可以利用最小二乘法对w和b进行估计,把w和b统一为w^ = (w;b)
令该求导得值为0,可得:
三.对数线性回归
既然由线性回归,那我们可不可以产生一个衍生物使得模型预测值逼近y?
lny = wTx + b,这就是对数线性回归
黑色那条线性回归和对数线性回归得差别有图可以看出,对数线性回归变化小。
四.逻辑斯特回归
单位位阶函数不连续,故不可以直接用作g-(.),如果我们希望它单调可微,可以产生这么一个替代函数
该函数图像与单位位阶比较:
对数几率函数:
将y视作类后验概率估计p(y=1|x),可得到
五:算法得实现
import numpy as np
class LogisticRegression:
def __init__(self, lr=0.01, num_iter=100000, fit_intercept=True, verbose=False):
self.lr = lr
self.num_iter = num_iter
self.fit_intercept = fit_intercept
self.verbose = verbose
def __add_intercept(self, X):
intercept = np.ones((X.shape[0], 1))
return np.concatenate((intercept, X), axis=1)
def __sigmoid(self, z):
return 1 / (1 + np.exp(-z))
def __loss(self, h, y):
return (-y * np.log(h) - (1 - y) * np.log(1 - h)).mean()
def fit(self, X, y):
if self.fit_intercept:
X = self.__add_intercept(X)
# 初始化模型参数
self.theta = np.zeros(X.shape[1])
for i in range(self.num_iter):
# 计算预测值和损失函数
z = np.dot(X, self.theta)
h = self.__sigmoid(z)
loss = self.__loss(h, y)
# 计算梯度并更新模型参数
gradient = np.dot(X.T, (h - y)) / y.size
self.theta -= self.lr * gradient
if self.verbose and i % 10000 == 0:
print(f'Loss at iteration {i}: {loss}')
def predict_proba(self, X):
if self.fit_intercept:
X = self.__add_intercept(X)
return self.__sigmoid(np.dot(X, self.theta))
def predict(self, X, threshold=0.5):
return self.predict_proba(X) >= threshold
六:总结
逻辑斯特和逻辑挂不上钩的,是一种对于分类问题的机器学习算法。它通过将输入特征与一个sigmoid函数组合,以预测二元分类的概率
它的特点:
无需事先假设数据分布
可得到“类别”的近似概率预测(概率值还可用于后续应用)
可直接应用现有数值优化算法(如牛顿法)求取最优解,具有快速、高效的特点