[机器学习]-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.mzph.cn/pingmian/34914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

江苏隆昌化工上线隆道平台 采购管理迎来全面升级

当前,传统产业与数字产业深度加速融合,大数据、云计算、人工智能等新技术推动产业深刻变革,能源化工行业迎来战略转型加速期。数字化转型已成为能源化工企业提升运营效率、控制运营成本、提高产品质量、打造竞争优势的强大引擎。为实现传统采…

在C#中使用事务

文章目录 一、概述1、事务ACID特性2、.NET开发者用到的5种事务机制:二、数据库事务1、不同数据库的事务规则2、数据库事务的优势和限制三、ADO.Net事务四、System.EnterpriseServices自动事务处理五、System.Transactions事务1、显式事务(Explicit Transaction)2、Transacti…

数据库管理-第213期 HaloDB-Oracle兼容性测试03(20240625)

数据库管理213期 2024-06-25 数据库管理-第213期 HaloDB-Oracle兼容性测试03(20240625)1 索引1.1 B-Tree索引1.2 Hash索引1.3 复合索引1.4 唯一索引1.5 表达式索引1.6 部分索引 2 视图3 表连接3.1 内连接3.2 左/右外连接3.3 全连接清理环境: …

Linux内核测试技术

Linux 内核是Linux操作系统的核心部分,负责管理硬件资源和提供系统调用接口。随着 Linux 内核的不断发展和更新,其复杂性和代码规模也在不断增加。因此,确保内核的稳定性和可靠性变得尤为重要。内核测试技术是实现这一目标的关键手段。本文将…

css中定义鼠标指针样式的属性cursor

在CSS中,cursor 属性用于定义鼠标指针在元素上移动时的样式。它允许你改变默认的鼠标指针样式,以提供关于用户可以进行哪些操作的视觉反馈。 以下是cursor属性的一些常见值和用法: 默认值:auto 这是大多数元素的默认设置。浏览器…

学懂C#编程:常用高级技术——学会C#多线程开发(一)

多线程基本概念 在C#中,多线程允许你同时执行多个代码路径。每个线程代表一个独立的执行流,操作系统可以在不同的处理器核心上并行执行这些线程,或者在单个核心上通过时间分片来模拟并行执行。 关键概念: Thread:代…

iptables配置NAT实现端口转发

加载防火墙的内核模块 modprobe ip_tables modprobe ip_nat_ftp modprobe ip_conntrack 1.开启路由转发功能 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf sysctl -p2、将本地的端口转发到本机端口 将本机的 7777 端口转发到 6666 端口。 iptables -t nat -A PR…

面试题:HTTP的body是二进制还是文本

实际上,HTTP的body可以是二进制数据,也可以是文本。HTTP协议本身不对body内容的格式做限制,具体格式取决于Content-Type头字段的定义。 文本数据: 当Content-Type头字段指定为文本类型时(如text/plain、text/html、ap…

C# Winform 开源UI库

WinForms,作为微软.NET框架下的一个桌面应用程序开发工具,自1999年首次亮相以来,已经走过了二十多年的发展历程。它以其简单直观的拖拽式界面设计和丰富的控件库,成为了大众喜爱的入门学习编程工具。由于它是比较基础的开发工具&a…

技术发展下的前端功能扩展与后端计算压力的减少

随着Web技术的迅猛发展,越来越多的计算和数据处理功能正逐渐从后端转移到前端。这一转变不仅提升了用户体验,还显著减少了后端服务器的计算压力。本文将探讨这一趋势的背景、技术实现及其带来的优势和挑战。 技术发展背景 传统的Web应用架构以服务器为…

Windows下如何实现微信多开/分身

新建文本文档 把下面的脚本复制到文本文档中 echo offstart "" "C:\Program Files\Tencent\WeChat\WeChat.exe" start "" "C:\Program Files\Tencent\WeChat\WeChat.exe"exit把wechat.exe的路径替换成你自已的路径 想多开几个就复制…

如何写好AI绘画提示词?保姆级教程来了!

前言 提示词编辑是一个结构化的过程,用能被人类解释和理解的词语来描述图像,也就是告诉人工智能模型应该怎么绘制图片。 生成优质图像的秘诀 1.提示词要想编辑好,包括修饰词和好的句子结构,首先你要了解所有的修饰词类型。 2.St…

探索Perl中哈希的奥秘:创建与使用指南

探索Perl中哈希的奥秘:创建与使用指南 引言 Perl,这门被誉为“程序员的瑞士军刀”的语言,以其在文本处理和系统管理中的卓越性能而闻名。在Perl的世界里,哈希(Hash)扮演着至关重要的角色,它提…

SAP的RFID

射频识别 (RFID) 避免了条码扫描的局限性,条码扫描需要对每个条码进行视线访问,并且一次只能用于扫描一个项目。 一次扫描一个标签可能会令人厌烦和压力大,这会增加人为错误的机会。相反,RFID 标签不需要直…

紧贴国家大战略需求,聚焦当前行业热点-海云安D10入选第四届香蜜湖金融科技创新奖拟奖项目

近日,第四届香蜜湖金融科技创新奖终审总结会在深圳市福田区湾区国际金融科技城成功举办,活动现场,专家评审委员会最终揭晓25个拟奖项目。海云安“开发者安全助手系统”项目,实力入选第四届香蜜湖金融科技创新奖-优秀项目奖。 1、香…

关于导入springcloud项目一些jar加载不进去的问题处理

IntelliJ IDEA的Maven项目有时候通过右边Maven Projects面板的package或者install命令打包的时候,会报错导致打包失败,这是由于这两个命令打包前默认会运行tests测试,若测试失败则打包失败。但是有时候我们打包的时候一些项目配置是针对生产环…

如何解决远距离传输大文件慢的问题?

在数字化时代,无论是企业还是个人,经常需要处理跨越长距离的大规模文件传输任务。这种传输的效率和安全性对业务流程的顺畅至关重要。然而,我们经常遇到网络延迟、数据丢失、带宽限制等问题,这些都可能影响文件传输的效率。小编将…

PreparedStatement和Statement的区别是什么

PreparedStatement和Statement都是Java中用于执行SQL语句的接口,但它们之间存在显著的差异。以下是关于这两个接口的主要区别: 安全性和SQL注入: PreparedStatement:它是安全的,因为它支持参数化查询,即使…

从传统到智能:视频汇聚EasyCVR+AI视频监控如何助力仓储的智能化转型

随着物流行业的快速发展和市场竞争的加剧,仓储管理对于保证货物安全、提高运营效率显得尤为重要。传统的仓储监控方式已难以满足现代仓储管理的需求,因此,仓储视频智能监控解决方案应运而生。方案通过集成先进的视频监控技术、智能分析算法、…