这几天,很多人私聊,说是放假在学习算法,巩固算法知识点,方面后续春招面试使用。
老规矩:大家伙如果觉得近期文章还不错!欢迎大家点个赞、收藏
咱们今天就从下面7种算法模型为出发点,进行总结性的介绍,分别汇总核心的公式、优缺点以及最适用的场景方面介绍。
文末还有一份面试大礼包,为大家找到称心的OFFER,助力一把火。
先来说说逻辑回归,逻辑回归是一种广泛用于二分类问题的线性模型。其核心思想是通过线性组合输入特征,然后通过一个称为sigmoid函数(也称为逻辑函数)将线性输出转换为概率值,用于表示样本属于正类的概率。
给定输入特征 和参数权重 ,逻辑回归的模型输出 通过以下公式计算:
其中, 是偏置(截距)项。然后,通过sigmoid函数将 转换为概率 :
其中, 是自然对数的底数。
最终,将概率 转换为二分类的预测值,例如 或 ,通常使用一个阈值(通常为 )。
简单而有效,容易实现和理解。
适用于线性可分或近似可分的数据。
输出结果是概率,可以直观地解释样本属于正类的可能性。
对于非线性问题的建模能力相对较弱。
对于特征之间存在高度相关性时,逻辑回归可能表现不佳。
对于噪声较大的数据敏感。
不适用于多类别分类问题(通常用于二分类)。
二分类问题,如垃圾邮件分类、疾病诊断等。
需要得到概率估计的场景,如点击率预测。
import numpy as np
import matplotlib.pyplot as plt
# Sigmoid函数
def sigmoid(z):
return 1 / (1 + np.exp(-z))
# 生成模拟数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = (4 + 3 * X + np.random.randn(100, 1)) > 6
# 训练逻辑回归模型
X_b = np.c_[np.ones((100, 1)), X]
theta = np.random.randn(2, 1)
lr = 0.1 # 学习率
n_iterations = 1000
for iteration in range(n_iterations):
logits = X_b.dot(theta)
predictions = sigmoid(logits)
errors = predictions - y
gradients = X_b.T.dot(errors) / len(y)
theta -= lr * gradients
# 绘制数据和决策边界
plt.scatter(X, y)
x_values = np.linspace(0, 2, 100)
y_values = sigmoid(theta[0] + theta[1] * x_values)
plt.plot(x_values, y_values, 'r-', label='Decision Boundary')
plt.xlabel('X')
plt.ylabel('Probability')
plt.legend()
plt.show()
上述代码生成了一个简单的二分类数据集,然后使用逻辑回归进行模型训练,最后绘制了数据和决策边界。在图形中,决策边界表示模型在样本点上的输出为 的位置。
决策树是一种基于树状结构的分类和回归模型。在决策树中,每个内部节点表示对某个特征的测试,每个分支代表测试的结果,每个叶节点表示一个类别或回归值。通过从根节点到叶节点的路径,可以对输入样本进行分类或回归。
决策树的建立主要基于以下两个步骤: 1. 特征选择: 选择最佳的特征,将数据集分成最具有区分性的子集。 2. 树的构建: 递归地将数据集划分成子集,直到满足停止条件,如达到最大深度或节点包含的样本数小于某个阈值。
简单直观,易于理解和解释,可视化效果好。
能够处理数值型和类别型数据。
不需要特别的数据准备,如归一化。
在相对较短的时间内能够对大型数据源做出可行且效果良好的结果。
容易过拟合,特别是在数据维度较高时。
对异常值敏感。
不稳定性高,数据的小变动可能导致树结构的巨大变化。
不适合处理复杂的关系。
需要可解释性强的场景,如医学诊断。
数据具有明显的特征分界线。
小到中型数据集。
用于特征选择。
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 构建决策树模型
dt_clf = DecisionTreeClassifier()
dt_clf.fit(X, y)
# 可视化决策树
plt.figure(figsize=(12, 8))
plot_tree(dt_clf, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
上述代码使用Scikit-Learn库加载鸢尾花数据集,然后构建并可视化了一个决策树模型。可视化结果以树的形式展现了特征的选择和决策路径。
随机森林是一种集成学习方法,通过构建多个决策树并取其结果的平均值或多数投票来提高模型的性能和泛化能力。每个决策树都是在不同的数据子集和特征子集上训练的,这样可以增加模型的多样性,减小过拟合风险。
1. 随机选择样本: 对于每个决策树的训练,从训练集中随机选择一部分样本,有放回地进行采样。 2. 随机选择特征: 在每个决策树的每个节点上,随机选择一部分特征进行考虑,以确保决策树的多样性。 3. 投票或平均: 对于分类问题,多个树的输出进行投票,对于回归问题,取多个树的平均值。
高准确性:随机森林在许多情况下能够取得很好的性能。
抗过拟合:通过随机选择样本和特征,降低了过拟合的风险。
适用于大规模数据集和高维特征。
不太容易解释:随机森林中包含多个决策树,难以解释整个模型的逻辑。
训练时间较长:相比于单一决策树,需要训练多个决策树,因此训练时间较长。
对噪声敏感:随机森林可能对噪声敏感,尤其是在数据中存在大量噪声时。
高维度数据集。
大规模数据集。
需要较高准确性的分类或回归问题。
用于特征选择。
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 构建随机森林模型
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X, y)
# 可视化一个决策树
plt.figure(figsize=(12, 8))
tree = rf_clf.estimators_[0]
from sklearn.tree import plot_tree
plot_tree(tree, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()
上述代码使用Scikit-Learn库加载鸢尾花数据集,然后构建并可视化了一个随机森林模型中的一个决策树。
朴素贝叶斯是基于贝叶斯定理的分类算法,其“朴素”之处在于假设所有特征都是相互独立的,这个假设使得计算条件概率变得更简单。根据贝叶斯定理,朴素贝叶斯模型可以通过计算每个类别的后验概率,选择具有最大后验概率的类别作为预测结果。
对于给定的特征 和类别 ,贝叶斯定理表示为:
其中:
是后验概率,表示在给定观测值 的条件下,类别 的概率。
是似然概率,表示在类别 的条件下观测到 的概率。
是先验概率,表示在没有观测到任何数据的情况下,类别 的概率。
是证据因子,表示观测到 的概率。
由于朴素贝叶斯的“朴素”假设,可以将似然概率表示为各个特征的条件概率的乘积:
简单而高效,适用于大规模数据集。
对小规模数据也能表现良好。
适用于多类别分类和文本分类问题。
不容易受到异常值的影响。
朴素贝叶斯假设所有特征相互独立,这在实际数据中可能不成立,影响模型性能。
对于特征空间较大的数据集,模型可能不够灵活,性能可能不如其他更复杂的算法。
文本分类,如垃圾邮件过滤、情感分析等。
多类别分类问题。
数据集维度较高但特征之间相互独立的情况。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建朴素贝叶斯模型
nb_classifier = GaussianNB()
nb_classifier.fit(X_train, y_train)
# 预测并评估模型
y_pred = nb_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"Accuracy: {accuracy}")
print(f"Confusion Matrix:\n{conf_matrix}")
# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()
# Accuracy: 1.0
# Confusion Matrix:
# [[10 0 0]
# [ 0 9 0]
# [ 0 0 11]]
上述代码使用Scikit-Learn库加载鸢尾花数据集,构建并评估了一个朴素贝叶斯分类器,并可视化了混淆矩阵。混淆矩阵用于显示分类器的性能,包括正确的预测和错误的预测。
K最近邻算法是一种基于实例的学习方法,用于分类和回归。对于分类问题,它基于输入样本在特征空间中的最近邻居来进行分类。算法的核心思想是认为相似的样本在特征空间中有相似的标签。
1. 距离度量: 通常使用欧氏距离或曼哈顿距离等度量两个样本之间的距离。
欧氏距离:
曼哈顿距离:
2. 投票机制: 对于分类问题,KNN通过选取离输入样本最近的k个邻居,并以这些邻居中出现最频繁的类别作为输入样本的类别。
3. 回归问题: 对于回归问题,KNN通常采用k个最近邻居的平均值来估计目标值。
简单直观,易于实现和理解。
适用于小规模数据集和特征数较少的问题。
在对数据进行适当预处理的情况下,效果通常较好。
对大规模数据集的计算开销较大。
对异常值敏感。
需要选择合适的距离度量和k值,这可能会影响模型性能。
小规模数据集,特征数不多的问题。
分类问题,特别是在类别之间的决策边界不规则或存在噪声时。
用于回归问题时,目标函数在输入空间中具有局部性质。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建KNN模型
knn_classifier = KNeighborsClassifier(n_neighbors=3)
knn_classifier.fit(X_train, y_train)
# 预测并评估模型
y_pred = knn_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"Accuracy: {accuracy}")
print(f"Confusion Matrix:\n{conf_matrix}")
# 可视化混淆矩阵
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=iris.target_names, yticklabels=iris.target_names)
plt.xlabel('Predicted')
plt.ylabel('True')
plt.show()
上述代码使用Scikit-Learn库加载鸢尾花数据集,构建并评估了一个K最近邻分类器,并可视化了混淆矩阵。混淆矩阵用于显示分类器的性能,包括正确的预测和错误的预测。
支持向量机是一种用于分类和回归的监督学习模型。在分类问题中,SVM的目标是找到一个超平面,将数据集分成两个类别,并使得超平面到最近的数据点(支持向量)的距离最大化。支持向量机还可以通过核函数在高维空间中处理线性不可分的问题。
1. 决策函数: 对于输入特征向量 ,SVM的决策函数表示为:
其中, 是超平面的法向量, 是偏置(截距)项。
2. 间隔(Margin): 间隔是超平面到最近的数据点的距离。SVM的目标是最大化这个间隔。
3. 最优化问题: SVM的优化目标可以表示为一个凸二次规划问题:
在高维空间中有效,适用于特征数较多的问题。
在处理线性可分问题时,具有较高的分类性能。
通过使用不同的核函数,可以处理非线性问题。
对于大规模数据集和特征数较多的问题,训练时间可能较长。
对噪声和异常值敏感。
需要选择合适的核函数和参数。
二分类或多分类问题。
特征维度较高的问题。
数据集相对较小或中等大小。
from sklearn.datasets import make_classification
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np
# 生成随机数据集
X, y = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)
# 构建支持向量机模型
svm_classifier = SVC(kernel='linear', C=1000)
svm_classifier.fit(X, y)
# 可视化决策边界和支持向量
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis', marker='o', s=50)
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()
# 创建网格来评估模型
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50), np.linspace(ylim[0], ylim[1], 50))
Z = svm_classifier.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制决策边界和支持向量
plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5, linestyles=['--', '-', '--'])
plt.scatter(svm_classifier.support_vectors_[:, 0], svm_classifier.support_vectors_[:, 1], s=100, linewidth=1, facecolors='none', edgecolors='k', marker='o')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Support Vector Machine')
plt.show()
上述代码生成一个随机数据集,构建了一个线性核的支持向量机模型,并可视化了决策边界和支持向量。支持向量机的决策边界是一个最大化间隔的超平面,支持向量是离决策边界最近的数据点。
人工神经网络是由多个神经元组成的层次结构,包括输入层、隐藏层(可以有多个),和输出层。每个神经元与下一层的每个神经元都有连接权重,并通过激活函数处理输入以产生输出。神经网络通过训练数据调整连接权重,以学习输入与输出之间的复杂映射关系。
对于一个具有 个输入、 个隐藏层神经元和 个输出的神经网络: 1. 输入层到隐藏层:
其中, 是隐藏层神经元的输出, 是激活函数, 是输入层到隐藏层的权重, 是偏置项。
2. 隐藏层到输出层:
其中, 是输出层神经元的输出, 是隐藏层到输出层的权重, 是偏置项。
3. 反向传播算法: 通过计算损失函数的梯度,使用梯度下降法来更新权重和偏置项,以最小化损失函数。
能够适应复杂的非线性关系,适用于各种问题。
在大规模数据集上表现良好,具有较强的泛化能力。
训练过程可能较慢,尤其是在大型网络上。
对于小样本数据集容易过拟合。
对于超参数的选择和调整敏感。
图像识别、语音识别等复杂模式识别问题。
大规模数据集的分类或回归问题。
需要进行特征学习的问题。
以下是一个简单的神经网络的构建和训练的示例代码:
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
# 生成随机数据集
np.random.seed(42)
X = np.random.rand(100, 1)
y = 3 * X + 2 + 0.1 * np.random.randn(100, 1)
# 转换为PyTorch的Tensor
X_tensor = torch.tensor(X, dtype=torch.float32)
y_tensor = torch.tensor(y, dtype=torch.float32)
# 定义神经网络模型
class SimpleLinearRegression(nn.Module):
def __init__(self):
super(SimpleLinearRegression, self).__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
# 初始化模型、损失函数和优化器
model = SimpleLinearRegression()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
# 前向传播
predictions = model(X_tensor)
loss = criterion(predictions, y_tensor)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 可视化结果
with torch.no_grad():
plt.scatter(X, y, label='Original data')
plt.plot(X, model(X_tensor).numpy(), color='red', linewidth=2, label='Fitted line')
plt.xlabel('X')
plt.ylabel('y')
plt.legend()
plt.show()
上述代码构建了一个简单的线性回归神经网络,使用PyTorch进行模型的训练和可视化拟合结果。训练过程中,模型通过优化损失函数逐步拟合训练数据。
独学而无优则孤陋而寡闻,技术要学会交流、分享,不建议闭门造车。
面试、技术交流与答疑、源码获取,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。
方式①、微信搜索公众号:Python学习与数据挖掘,后台回复:资料
方式②、添加微信号:dkl88194,备注:资料
资料
我们打造了《100个超强算法模型》,特点:从0到1轻松学习,方法论及原理、代码、案例应有尽有,所有案例都是按照这样的节奏进行表述。