一.线性模型与回归
线性模型是机器学习中常用的一类模型,其一般形式为:
f(x) = w1x1 + w2x2 + … + wdxd + b
其中,x=(x1, x2, ..., xd) 是由d维属性描述的样本,w=(w1, w2, ..., wd) 是待求解的系数,b 是截距。
给定数据集 D={(x1, y1), (x2, y2), ..., (xm, ym)},其中 xi=(xi1, xi2, ..., xid),yi∈R,线性回归的目标是学习一个线性模型,使得 f(xi)≈yi。
二.Logistic回归
Logistic回归是一种用于解决二分类问题的统计学习方法。尽管其名字中含有"回归"一词,但实际上,Logistic回归是一种分类算法,用于预测样本属于两个类别中的哪一个。
算法原理:
Logistic回归采用了一种称为Sigmoid函数的特殊函数来实现分类。Sigmoid函数的数学表达式为:
σ(z)=1/1+e^−z
其中,z 是输入的线性组合(特征的加权和与截距的和)。Sigmoid函数的输出范围在0到1之间,可以被解释为样本属于正类别的概率。
Logistic回归的特点和优势:
-
可解释性强: Logistic回归模型得到的系数可以解释为特征对分类的贡献程度,因此具有较好的可解释性。
-
计算代价低: 训练Logistic回归模型的计算代价相对较低,尤其适用于大规模数据集。
-
概率输出: 输出结果是样本属于正类别的概率,方便进行阈值的调整,同时对不确定性的问题有良好处理。
-
抗噪声能力强: 对于一些噪声数据,Logistic回归能够产生较为鲁棒的分类结果。
三.代码
sigmoid函数:
# sigmoid函数
def sigmoid(inX):
return 1.0 / (1 + exp(-inX))
梯度上升算法:
def gradAscent(dataMatIn, classLabels):
dataMatrix = np.mat(dataMatIn)
labelMat = np.mat(classLabels).transpose()
m, n = np.shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = np.ones((n, 1))
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = (labelMat - h)
weights = weights + alpha * dataMatrix.transpose() * error
return weights
分类函数:
def classifyVector(inX, weights):
prob = sigmoid(sum(inX * weights))
if prob > 0.5:
return 1.0
else:
return 0.0
def generate_data():
np.random.seed(42)
num_points = 100
# 生成两个正态分布的数据集,分别代表两个类别
class1 = np.random.normal(5, 1, (num_points, 2))
class2 = np.random.normal(10, 1, (num_points, 2))
data = np.vstack((class1, class2))
labels = np.hstack((np.zeros(num_points), np.ones(num_points)))
return data, labels
def train_logistic_regression(data, labels):
weights = gradAscent(data, labels)
return weights
def plot_logistic_regression(data, labels, weights):
plt.scatter(data[:, 0], data[:, 1], c=labels, cmap=plt.cm.Spectral)
x_min, x_max = plt.xlim()
y_min, y_max = plt.ylim()
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = sigmoid(np.c_[xx.ravel(), yy.ravel()] @ weights)
Z = Z.reshape(xx.shape)
plt.contour(xx, yy, Z, levels=[0.5], cmap="RdYlBu", vmin=0, vmax=1)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Logistic Regression Decision Boundary')
plt.show()
def main():
data, labels = generate_data()
weights = train_logistic_regression(data, labels)
plot_logistic_regression(data, labels, weights)
if __name__ == "__main__":
main()
-
generate_data
: 生成两个类别的模拟数据集,每个类别有100个样本,特征维度为2,分别采用正态分布生成。 -
train_logistic_regression
: 使用梯度上升算法训练逻辑回归模型,输入数据和标签,返回训练得到的模型参数(权重)。 -
plot_logistic_regression
: 可视化逻辑回归的结果,绘制散点图表示数据分布,绘制决策边界(等概率线)来展示模型的分类效果。 -
main
: 主函数,调用generate_data
生成数据,使用train_logistic_regression
训练模型,最后通过plot_logistic_regression
可视化模型分类结果。