[机器学习]-2 经典机器学习算法

一 线性模型

线性模型是机器学习中最基本和最常用的一类模型,假设输出变量是输入变量的线性组合。线性模型在许多实际应用中表现良好,并且为更复杂的模型(如非线性模型、深度学习模型)奠定了理论基础;优点是简单易懂,易于实现和解释,计算复杂度低,适合大规模数据;缺点是不能处理复杂的非线性关系,容易受到异常值的影响,可能出现过拟合或欠拟合,需要正则化处理。

线性模型假设输出y是输入变量 x=[x1,x2,…,xn]的线性组合,加上一个常数项(截距项)和噪声项:y=wTx+b+ϵ,其中:

w=[w1,w2,…,wn]是权重向量;

b是截距(bias)或偏置项;

ϵ是噪声项,通常假设服从正态分布。

1 主要类型

1)线性回归(Linear Regression):拟合一个线性函数来预测连续目标变量。

模型表达式:y=wTx+b

损失函数:最小化均方误差(MSE),MSE=1/m {∑i=1m(yi−(wTxi+b))2}

优化方法:梯度下降、正规方程、最小二乘法等。

2)逻辑回归(Logistic Regression):用于分类问题,通过sigmoid函数将线性组合映射到[0,1]之间,表示概率。

模型表达式:y= σ(wTx+b),σ(z) =1/(1 + e-z)

损失函数:对数似然损失,Loss=−1/m {∑i=1m [yilog(^yi)+(1−yi)log(1−^yi)]}

优化方法:梯度下降、牛顿法等。

3)Ridge回归:在线性回归基础上添加L2正则化,减少过拟合。

模型表达式:y=wTx+b

损失函数:最小化正则化的均方误差,Loss=1/m {∑i=1m [yi−(wTxi+b)]2+ λ∥w∥2}

4)Lasso回归:在线性回归基础上添加L1正则化,实现特征选择。

模型表达式:y=wTx+b

损失函数:最小化正则化的均方误差,Loss=1/m {∑i=1m [yi−(wTxi+b)]2+ λ∥w∥1}

2 建模和训练方法

数据预处理:标准化,将数据进行标准化处理,使得每个特征均值为0,方差为1;特征选择,选择对目标变量有显著影响的特征。

训练过程

   - 初始化参数(权重和截距);

   - 计算损失函数的梯度;

   - 更新参数:根据梯度和学习率,使用优化算法(如梯度下降)更新参数;

   - 迭代上述过程,直到损失函数收敛或达到最大迭代次数。

二 决策树

决策树是一种用于分类和回归的非参数监督学习方法,以树状结构表示决策过程,通过对特征进行条件判断来预测目标变量。决策树易于理解和解释,结果具有直观的可视化,能够处理数值型和类别型数据和多输出问题,对缺失值不敏感,可以容忍一定程度的缺失数据。但决策树容易过拟合,需剪枝处理;对噪声数据敏感,容易受极端值影响;在处理类别较多的数据集时,树的构建可能会变得复杂且计算量大。

1 决策树的构建

决策树的构建过程通过递归地选择最优特征来分割数据集,使得每次分割能够最大化地减少数据的不纯度或不确定性。

1)特征选择标准

信息增益:基于熵(Entropy)的变化量来选择特征,常用ID3算法。

InfoGain(D, A) = Entropy(D) - ∑v∈Values(A)(∣Dv∣/∣D∣)Entropy(Dv)

信息增益率:修正了信息增益偏好多值特征的问题,常用C4.5算法。

GainRatio(D, A) = InfoGain(D, A) / SplitInfo(D, A)

基尼指数:基于基尼不纯度选择特征,常用CART算法。

Gini(D) = 1 - ∑K=1K (pk)^2

    

2)树的构建过程

2.1)从根节点开始,计算所有特征的选择标准(如信息增益)。

2.2)选择最优特征,根据该特征的不同取值分割数据集。

2.3)为每个子集递归地构建子树,重复步骤1和2,直到满足停止条件。

3)停止条件

   - 所有样本属于同一类别。

   - 特征集为空或没有更多特征可分割。

   - 达到最大树深度或最小样本数。

2 决策树的剪枝

决策树在训练过程中容易过拟合,为了提高泛化能力,需要进行剪枝,分为前剪枝和后剪枝。

1)前剪枝:在构建过程中提前停止树的生长。

   - 设置最大树深度。

   - 设置叶节点的最小样本数。

   - 设置信息增益阈值。

2)后剪枝:先构建一棵完整的决策树,然后回溯剪枝。

代价复杂度剪枝:通过最小化损失函数选择最优子树,Loss(T)=∑t∈T [Loss(t)+α∣T∣]

交叉验证剪枝:通过交叉验证评估子树的性能,选择最优子树。

3 决策树的实现

以Python的Scikit-Learn库为例,介绍决策树的实现过程。

1)导入库和数据

   from sklearn.datasets import load_iris

   from sklearn.model_selection import train_test_split

   from sklearn.tree import DecisionTreeClassifier

   # 加载数据集

   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.3, random_state=42)

  

2)构建和训练决策树模型

   # 构建决策树分类器

   clf = DecisionTreeClassifier(criterion='gini', max_depth=3, random_state=42)

   # 训练模型

   clf.fit(X_train, y_train)

   

3)模型评估

   from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

   # 预测

   y_pred = clf.predict(X_test)

   # 评估

   print("Accuracy:", accuracy_score(y_test, y_pred))

   print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

   print("Classification Report:\n", classification_report(y_test, y_pred))

 4)决策树可视化

   from sklearn.tree import export_graphviz

   import graphviz

   # 导出决策树结构

   dot_data = export_graphviz(clf, out_file=None,

                              feature_names=iris.feature_names,  

                              class_names=iris.target_names,  

                              filled=True, rounded=True,  

                              special_characters=True)  

   graph = graphviz.Source(dot_data)  

   graph.render("iris")  # 保存为文件

   graph.view()  # 显示决策树

  

三 支持向量机SVM

支持向量机(Support Vector Machine)是一种用于分类和回归的监督学习算法,通过寻找最佳分离超平面来实现数据分类,具有很高的分类性能,特别适用于小样本、高维度的数据。但SVM对缺失数据较为敏感,计算复杂度较高,训练时间较长,需要选择合适的核函数和参数较为复杂,需要调参。

1 基本概念

1)支持向量:离分离超平面最近的样本点,这些点对决策边界起决定作用。

2)超平面:在特征空间中将不同类别样本分开的决策边界。

3)间隔:支持向量到超平面的距离,SVM通过最大化间隔来提高分类器的泛化能力。

2 线性SVM

1)线性可分数据:当数据集是线性可分的,SVM试图找到能够将数据分开的最佳超平面。

目标:最大化间隔2/ ∥W∥

约束条件:yi (w⋅xi +b)≥1,∀i

优化问题:minw,b (1/2) ∥W∥2

2)线性不可分数据:对于线性不可分数据,SVM引入松弛变量ξi允许某些样本点违背约束条件。

优化问题:minw,b,ξ (1/2) ∥W∥2 + C∑i=1n ξi ,其中C 是惩罚参数,控制误差项对优化目标的影响。在以下约束条件下:yi (w⋅xi +b) ≥ 1−ξi​,ξi ≥ 0,∀i。

3 非线性SVM

对于非线性可分数据,SVM通过核函数(Kernel Function)将数据映射到高维空间,使其在高维空间中线性可分。

1)核函数:将输入数据映射到高维特征空间的函数,常用的核函数包括:

线性核:K(xi, xj) = xi⋅xj​

多项式核:K(xi, xj) = (xi⋅xj +c)d

高斯径向基函数核:K(xi, xj) = exp(−γ∥xi-xj∥2)

sigmoid 核:K(xi, xj) = tanh(αxi⋅xj +c)

2)优化问题:通过核函数将优化问题从原始空间转到高维特征空间。

目标:minα (1/2)∑i=1n∑j=1nαiαj yiyj K(xi, xj) − ∑i=1nαi​

在以下约束条件下:∑i=1nαiyi = 0, 0≤αi≤C,∀i

4 SVM的多类分类

SVM本质上是二分类器,处理多类分类问题时,常用以下策略:一对多(One-vs-Rest, OvR),将一个类别与其他所有类别进行二分类,构建多个二分类器;一对一(One-vs-One, OvO),将每两个类别进行二分类,构建K(K-1)/2个二分类器(K为类别数)。

5 SVM的实现

以Python的Scikit-Learn库为例,介绍SVM的实现过程。

1)导入库和数据

   from sklearn.datasets import load_iris

   from sklearn.model_selection import train_test_split

   from sklearn.svm import SVC

   # 加载数据集

   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.3, random_state=42)

  2)构建和训练SVM模型

   # 构建支持向量分类器

   clf = SVC(kernel='rbf', C=1, gamma='scale')

   # 训练模型

   clf.fit(X_train, y_train)

  

3)模型评估

   from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

   # 预测

   y_pred = clf.predict(X_test)

   # 评估

   print("Accuracy:", accuracy_score(y_test, y_pred))

   print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))

   print("Classification Report:\n", classification_report(y_test, y_pred))

   

4)参数调优

   from sklearn.model_selection import GridSearchCV

   # 参数网格

   param_grid = {'C': [0.1, 1, 10], 'gamma': ['scale', 'auto', 0.1, 1, 10], 'kernel': ['rbf', 'poly', 'sigmoid']}

   # 网格搜索

   grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=3)

   grid.fit(X_train, y_train)

   # 最佳参数

   print("Best Parameters:", grid.best_params_)

   # 使用最佳参数预测

   grid_predictions = grid.predict(X_test)

   # 评估

   print("Grid Search Accuracy:", accuracy_score(y_test, grid_predictions))

四 K近邻学习(K-Nearest Neighbors, KNN)

K近邻算法是一种基本且直观的机器学习算法,广泛用于分类和回归问题。KNN算法基于“相似的样本具有相似的特征”这一假设,给定一个待分类样本,通过计算它与训练集中所有样本的距离,找到最近的K个样本(邻居),然后根据这K个样本的标签进行投票,决定待分类样本的类别。在回归问题中,KNN通过计算最近K个样本标签的平均值来预测。

KNN算法思想简单,容易理解和实现,不需要对训练数据进行显式学习,直接对新数据进行预测。但预测时需要计算所有样本的距离,导致计算开销大,尤其是在数据量大时;而且对K值敏感,K值的选择对算法性能影响较大,K值过小容易过拟合,K值过大容易欠拟合;此外在高维数据中,距离计算可能会失去意义(维度灾难)。

1 算法步骤

1)选择K值:选择参数K,即选取的最近邻居的数量。

2)计算距离:计算待分类样本与训练集中每个样本之间的距离。常用的距离度量包括欧氏距离、曼哈顿距离、余弦相似度等。

3)找最近的K个邻居:根据计算的距离,找到距离待分类样本最近的K个训练样本。

4)投票决策:分类问题,对这K个邻居的标签进行投票,选择出现次数最多的标签作为预测结果;回归问题,计算这K个邻居的标签的平均值,作为预测结果。

2 KNN的距离度量

1)欧氏距离(Euclidean Distance):两点间的直线距离。

2)曼哈顿距离(Manhattan Distance):两点在各坐标轴上的绝对距离之和。

d(xi,xj) =∑m=1 n​∣xim−xjm∣

3)余弦相似度(Cosine Similarity):两向量之间的余弦值,用于度量方向的相似性。

Cosine Similarity(xi,xj) = (xi ⋅xj )/ (∥xi∥∥xj∥)​

3 KNN的实现

以Python中的Scikit-Learn库为例,展示KNN在分类和回归中的实现。

1)分类问题

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

# 加载数据集

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)

print(f"Accuracy: {accuracy:.2f}")

2)回归问题

from sklearn.datasets import load_boston

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsRegressor

from sklearn.metrics import mean_squared_error

# 加载数据集

boston = load_boston()

X = boston.data

y = boston.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 构建KNN回归模型

knn_regressor = KNeighborsRegressor(n_neighbors=3)

# 训练模型

knn_regressor.fit(X_train, y_train)

# 预测结果

y_pred = knn_regressor.predict(X_test)

# 评估模型

mse = mean_squared_error(y_test, y_pred)

print(f"Mean Squared Error: {mse:.2f}")

五 聚类

聚类是一种常见的无监督学习方法,其目的是将数据集中的样本划分为若干组,使得同一组内的样本相似度尽可能高,而不同组间的样本相似度尽可能低。聚类广泛应用于数据分析、模式识别、图像处理等领域。

1 基本概念

1)样本:数据集中的一个数据点。

2)簇(Cluster):一组相似的数据点。

3)相似度度量:衡量数据点之间相似程度的标准,常用的相似度度量包括欧氏距离、曼哈顿距离、余弦相似度等。

2 常见的聚类算法

1)K均值(K-Means)

原理:将数据集分为K个簇,使得每个数据点属于距离最近的簇中心(质心)。这种算法简单快速,适用于大规模数据集;但需要预先指定 K ,对初始值敏感,容易陷入局部最优,不能处理非球形分布的簇。

步骤:

1.1)随机选择K个初始质心。

1.2)分配每个数据点到最近的质心,形成 \( K \) 个簇。

1.3)重新计算每个簇的质心。

1.4)重复步骤 2 和 3,直到质心不再变化或达到最大迭代次数。

2)层次聚类

原理:通过层次结构将数据点聚类,不需要预先指定簇的数量,可以通过树状图可视化;但计算复杂度高,不适合大规模数据集,无法撤销合并操作。

步骤:

2.1)每个数据点自成一簇。

2.2)迭代地合并最近的两个簇,直到所有数据点合并到一个簇或达到指定簇数量。

3)DBSCAN(Density-Based Spatial Clustering of Applications with Noise)   

原理:基于数据点的密度分布进行聚类,可以发现任意形状的簇,并能识别噪声点,不需要预先指定簇数量;但对于不同密度的簇效果较差,参数ε和 MinPts 较难确定。

步骤:

3.1)指定半径ε和最小点数 MinPts。

3.2)从一个点出发,如果在半径ε内的点数大于等于 MinPts,则将这些点归为一个簇。

3.3)对新加入簇的点,重复步骤 2,直到不再有新的点加入。

4)均值漂移

原理:通过数据点密度梯度上升找到簇的质心,可以发现任意形状的簇,不需要指定簇数量。缺点是计算复杂度高,不适合大规模数据集

步骤:

4.1)对每个数据点计算其密度梯度的方向,并沿该方向移动。

4.2)重复步骤 1,直到所有数据点收敛到质心。

5)高斯混合模型

原理:假设数据由多个高斯分布组成,通过期望最大化(EM)算法估计每个高斯分布的参数。

步骤:

5.1)初始化每个高斯分布的参数。

5.2)计算每个数据点属于每个高斯分布的概率(E步)。

5.3)根据概率重新估计高斯分布的参数(M步)。

5.4)重复步骤 2 和 3,直到参数收敛。

3 评估指标

1)轮廓系数

   - 衡量聚类结果的紧密度和分离度。

   - 取值范围:[-1, 1],值越大表示聚类效果越好。

2)互信息

   - 衡量聚类结果与真实标签之间的互信息。

   - 值越大表示聚类结果与真实标签越一致。

3)调整兰德指数

   - 衡量聚类结果与真实标签的一致性。

   - 取值范围:[-1, 1],值越大表示聚类效果越好。

4)DB指数(Davies-Bouldin Index)

   - 衡量聚类结果的紧密度和分离度。

   - 值越小表示聚类效果越好。

4 聚类算法的实现

以Python的Scikit-Learn库为例,介绍K均值聚类实现过程。

   from sklearn.cluster import KMeans

   import numpy as np

   # 生成样本数据

   X = np.array([[1, 2], [1, 4], [1, 0],

                 [4, 2], [4, 4], [4, 0]])

   # 构建KMeans模型

   kmeans = KMeans(n_clusters=2, random_state=0)

   # 训练模型

   kmeans.fit(X)

   # 预测簇标签

   labels = kmeans.predict(X)

   print("Labels:", labels)

   # 簇中心

   print("Cluster Centers:", kmeans.cluster_centers_)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/744665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解锁高效办公:ONLYOFFICE新版本8.1功能揭秘与个人实战体验

文章目录 💯ONLYOFFICE 桌面编辑器 8.1 ✍1 新增功能介绍✍2 轻松编辑器PDF文件🍓2.1 PDF新增编辑器操作🍓2.2 PDF新增表单操作 ✍3 用幻灯片版式快速修改幻灯片✍4 无缝切换文档编辑、审阅和查看模式✍5 改进从右至左语言的支持 & 新的本…

C++——布隆过滤器

目录 布隆过滤器的提出 布隆过滤器的概念 布隆过滤器的基本原理和特点 布隆过滤器的实现 布隆过滤器的插入 布隆过滤器的查找 布隆过滤器的删除 布隆过滤器的优点 布隆过滤器的缺陷 布隆过滤器使用场景 布隆过滤器的提出 在注册账号设置昵称的时候,为了保证…

【已解决】SpringBoot图片更新需重启服务器才能显示

问题描述 1、更新头像,并跳转回列表页,发现显示不出来 2、但是前端获取用户头像的信息是在加载页面就会被调用的,同时前端也不存在所谓的缓存问题,因为没有动这部分代码。 但查看响应是能获得正确的信息(前端打印图片…

Docker 下载与安装以及配置

安装yum工具 yum install -y yum-ulits配置yum源 阿里云源 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Docker 17.03后为两个版本: 社区版(Community Edition,缩写为 CE&#x…

内网一键部署k8s-kubeshpere,1.22.12版本

1.引言 本文档旨在指导读者在内网环境中部署 Kubernetes 集群。Kubernetes 是一种用于自动化容器化应用程序部署、扩展和管理的开源平台,其在云原生应用开发和部署中具有广泛的应用。然而,由于一些安全或网络限制,一些组织可能选择在内部网络…

【踩坑】修复循环设置os.environ[‘CUDA_VISIBLE_DEVICES‘]无效

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 问题示例 for gpus in [0, 1, 2, 3, 4, 5, 6, 7]:os.environ[CUDA_VISIBLE_DEVICES] gpusprint(torch.cuda.get_device_name(0)) 始终将使用第…

专业技能篇---计算机网络

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么?二、Http的状态码有哪些?三、 HTTP与HTTPS有什么区别?四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别?六、GET与POST WebSock…

期货投机的操作

期货投机是一种高风险、高回报的投资方式,吸引着众多投资者参与。将深入探讨期货专业投机的操作秘诀,帮助投资者掌握必要的知识和技巧,在期货市场中驰骋。 一、期货专业投机的本质 期货投机是利用期货合约进行买卖,以赚取差价的一…

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型

Diffusion Mamba:用于CT到MRI转换的Mamba扩散模型 提出背景拆解左侧:整体框架中间:Mamba块的细节右侧:螺旋扫描的细节 提出背景 论文:https://arxiv.org/pdf/2406.15910 代码:https://github.com/wongzbb…

JAVA【案例5-2】模拟默认密码自动生成

【模拟默认密码自动生成】 1、案例描述 本案例要求编写一个程序,模拟默认密码的自动生成策略,手动输入用户名,根据用户名自动生成默认密码。在生成密码时,将用户名反转即为默认的密码。 2、案例目的 (1&#xff09…

超简单的nodejs使用log4js保存日志到本地(可直接复制使用)

引入依赖 npm install log4js 新建配置文件logUtil.js const log4js require(log4js);// 日志配置 log4js.configure({appenders: {// 控制台输出consoleAppender: { type: console },// 文件输出fileAppender: {type: dateFile,filename: ./logs/default, //日志文件的存…

【详述】BP神经网络建模流程一步一步详述

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、BP神经网络的建模流程二、BP神经网络的建模分步讲解2.1.数据归一化2.2.数据划分2.3.网络结构设置2.4.网络训练2.5.训练效果评估 本文梳理BP神经网络的建模流程,供大家建模时进行借鉴。 一、BP神经…

循环神经网络——RNN

循环神经网络 在之前NLP基础章节-语言模型中我们介绍了 n n n 元语法,其中单词 x t x_t xt​ 在时间步 t t t 的条件概率仅取决于前面 n n n 个单词,若是想要将之前单词的影响也加入那么模型参数数量会指数级增长。但是可能之前的单词存在重要的信息…

进阶篇08——MySQL管理

系统数据库 常用工具 mysql 客户端工具 mysqladmin 执行管理操作 mysqlbinlog 数据库二进制日志转成文本 mysqlshow 数据库查找 mysqldump 数据库备份 mysqlimport/source 数据库导入

LLM大语言模型-AI大模型全面介绍

简介: 大语言模型(LLM)是深度学习的产物,包含数十亿至数万亿参数,通过大规模数据训练,能处理多种自然语言任务。LLM基于Transformer架构,利用多头注意力机制处理长距离依赖,经过预训…

Python-爬虫 下载天涯论坛帖子

为了爬取的高效性,实现的过程中我利用了python的threading模块,下面是threads.py模块,定义了下载解析页面的线程,下载图片的线程以及线程池 import threading import urllib2 import Queue import re thread_lock threading.RL…

宝塔计划任务调用node程序时,log4js日志保存本地位置会发生变化

接我上一篇文章的情况 超简单的nodejs使用log4js保存日志到本地(可直接复制使用)-CSDN博客 原本应当保存在node项目目录下的日志文件,如果使用宝塔的计划任务来定时执行的话,日志保存路径会发生变化到如下图的位置: 如…

JFrame和JScrollPanel布局初步使用

还不是很了解,做了几个程序; import java.awt.Container; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.border.EmptyBorder;public class pa1 {public static void main(String[] agrs){JF…

AWS在国内的持续受欢迎:探究背后的原因

亚马逊云(AWS)作为全球领先的云计算服务提供商,在国内市场仍然保持着强劲的竞争力和广泛的用户群。尽管国内也有一些本土云计算服务提供商的崛起,但AWS在国内仍然有大量的用户在使用。我们九河云,一直致力AWS云相关服务…