class LogisticRegression:
"""使用Python语言来实现逻辑回归算法。"""
def __init__(self, alpha, times):
"""初始化方法。
Parameters
-----
alpha : float
学习率。
times : int
迭代次数。
"""
self.alpha = alpha
self.times = times
def sigmoid(self, z):
"""sigmoid函数的实现
Parameters
-----
z : float
自变量,值为z = w.T * x
Returns
-----
p : float, 值为[0, 1]之间。
返回样本属于类别1的概率值,用来作为结果的预测。
当s >= 0.5(z >= 0)时,判定为类别1, 否则判定为类别0。
"""
return 1.0 / (1.0 + np.exp(-z))
def fit(self, X, y):
"""根据提供的训练数据, 对模型进行训练。
Parameters
-----
X : 类数组类型。形状为:[样本数量, 特征数量]
待训练的样本特征属性。
y : 类数组类型。形状为:[样本数量]
每个样本的目标值。(标签)
"""
X = np.asarray(X)
y = np.asarray(y)
# 创建权重的向量,初始值为0,长度比特征数多1。(多出来的一个是截距)
self.w_ = np.zeros(1 + X.shape[1])
# 创建损失列表,用来保存每次迭代后的损失值。
self.loss_ = []
for i in range(self.times):
z = np.dot(X, self.w_[1:]) + self.w_[0]
# 计算概率值(结果判定为1的概率值)
p = self.sigmoid(z)
# 根据逻辑回归的代价函数(目标函数),计算损失值。
# 逻辑回归的代价函数(目标函数):
# J(w) = -sum(yi * log(s(zi)) + (1 - yi) * log(1 - s(zi))) [i从1到n,n为样本的数量]
cost = -np.sum(y * np.log(p)+ (1 - y) * np.log(1 - p))
self.loss_.append(cost)
# 调整权重值, 根据公式:调整为: 权重(j列) = 权重(j列) + 学习率 * sum( (y - s(z)) * x(j))
self.w_[0] += self.alpha * np.sum(y - p)
self.w_[1:] += self.alpha * np.dot(X.T, y - p)
def predict_proba(self, X):
"""根据参数传递的样本,对样本数据进行预测。
Parameters
-----
X : 类数组类型。 形状为[样本数量, 特征数量]
待测试的样本特征(属性)
Returns
-----
result : 数组类型
预测的结果(概率值)
"""
X = np.asarray(X)
z = np.dot(X, self.w_[1:]) + self.w_[0]
p = self.sigmoid(z)
# 将预测结果变成二维数组(结构)。便于后续的拼接。
p = p.reshape(-1, 1)
# 将两个数组进行拼接。方向为横向拼接。
return np.concatenate([1 - p, p], axis=1)
def predict(self, X):
"""根据参数传递的样本,对样本数据进行预测。
Parameters
-----
X : 类数组类型。 [样本数量, 特征数量]
待测试的样本特征(属性)
Returns
-----
result : 数组类型。
预测的结果(分类值)
"""
return np.argmax(self.predict_proba(X), axis=1)
逻辑回归
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 关于线回归、逻辑回归,各位大神总结的很精辟了,下面收藏几个好的讲解,以备忘。 逻辑回归三部曲 机器学习系列(1)_...