Course3-Week1-无监督学习

Course3-Week1-无监督学习

  • 笔记主要参考B站视频“(强推|双字)2022吴恩达机器学习Deeplearning.ai课程”。
  • 该课程在Course上的页面:Machine Learning 专项课程
  • 课程资料:“UP主提供资料(Github)”、或者“我的下载(百度网盘)”。
  • 本篇笔记对应课程 Course3-Week1(下图中深紫色)。

1. 欢迎

1.1 Course3简介

前面的Course1、Course2一直在讨论“有监督的机器学习”,Course3就来介绍不一样的内容:

  • Week1-无监督机器学习(unsupervised learning):主要学习“聚类(clustering)”及“异常检测(anomaly detection)”,这两种技术都广泛应用于商业软件中。
  • Week2-推荐机制(recommender systems):“推荐系统”是机器学习最重要的商业应用之一,影响的产值达到数十亿美元,但在学术界却并没有取得相应的关注。常见于购物网站、流媒体视频等“为你推荐/猜你喜欢”的功能,学完后将理解广告的推荐策略。
  • Week3-强化学习(reinforcement learning):“强化学习”是一项新的技术,和前面提到的技术相比,商业应用没有那么广泛。但这是一项令人兴奋的技术,它向人们展示了学习算法可以做的事情,比如打游戏、控制机器人等。课程最后将使用“强化学习”模拟一个月球着陆器。

1.2 数学符号约定

下面是本周会用到的数学符号,下面用到了再查就行。

数学符号约定:

  • 样本数量为 m m m、特征的数量为 n n n、质心的数量为 K K K
  • x ⃗ ( i ) \vec{x}^{(i)} x (i):是 n n n维向量,用于表示第 i i i 个样本的位置。
  • μ ⃗ k \vec{\mu}_k μ k:是 n n n维向量,用于表示第 k k k 个质心的位置。
  • c ( i ) c^{(i)} c(i):一个值,取值范围1~ K K K,表示第 i i i 个样本 x ⃗ ( i ) \vec{x}^{(i)} x (i) 所对应的质心索引,该质心到 x ⃗ ( i ) \vec{x}^{(i)} x (i) 的欧式距离最短。
  • μ ⃗ c ( i ) \vec{\mu}_{c^{(i)}} μ c(i):表示第 i i i 个样本 x ⃗ ( i ) \vec{x}^{(i)} x (i) 所对应的质心 c ( i ) c^{(i)} c(i) 的位置。等价于 μ ⃗ k \vec{\mu}_k μ k,只不过为了强调是 x ⃗ ( i ) \vec{x}^{(i)} x (i) 所对应的质心。
  • ∥ x ( i ) − μ k ∥ \lVert x^{(i)}-\mu_k \rVert x(i)μk:二阶范数,表示第 i i i 个样本 x ⃗ ( i ) \vec{x}^{(i)} x (i) 和第 k k k 个质心之间的欧式距离。但实际在代码中为减少计算量,通常使用该距离的平方,写成范数是为了数学形式的简便。
  • X = { x ⃗ ( 1 ) ; x ⃗ ( 2 ) ; . . . ; x ⃗ ( n ) } X = \{ \vec{x}^{(1)};\vec{x}^{(2)};...;\vec{x}^{(n)} \} X={x (1);x (2);...;x (n)}:是 m × n m×n m×n 二维矩阵,每一行表示一个样本的位置。
  • M = { μ ⃗ 1 ; μ ⃗ 2 ; . . . ; μ ⃗ K } \Mu = \{ \vec{\mu}_1;\vec{\mu}_2;...;\vec{\mu}_K \} M={μ 1;μ 2;...;μ K}:是 K × n K×n K×n 二维矩阵,每一行表示一个质心的位置。
  • c ⃗ = { c ( 1 ) , c ( 2 ) , . . . , c ( m ) } \vec{c} = \{ c^{(1)},c^{(2)},...,c^{(m)} \} c ={c(1),c(2),...,c(m)}:是 m m m维向量,每个数都表示一个样本对应的质心索引。

注:上述中,“位置”向量中的每个参数都表示一个特征。
注:视频中老师没有标注向量符号,为了严谨且方便叙述,我标注上了。

2. K-means算法

  “聚类(clustering)”算法会自动将相似的数据点归为一类。和“有监督学习”不同,“聚类”这样的“无监督学习”算法的数据集没有标签。比如在Course1-Week1-2.2节中给出的一系列“无监督学习”示例:新闻分类、基因分类、客户分群、天文数据分析等。并且,“聚类”算法除了被用于有很明显分组的数据集,也可以对没有明显分组的数据集进行分类,比如设计T恤时的S、M、L尺码。

图3-1-1 有监督学习和无监督学习的数据集示意图
图3-1-2 没有明显分组的数据集

2.1 K-means算法的步骤

  “K-means算法”是最常见的聚类算法,下面简单介绍一下“K-means算法”的原理。如下图所示,假设现在数据集中有30个未标记的训练样本,要求将数据分成两类。于是,我们可以先随机初始化两个“质心(centroid)”,然后不断的重复下面的步骤,直到质心的位置不再变化,也就是“收敛”:

  1. 为所有样本分配“质心”。也就是将当前样本,分配给距离最近的“质心”。
  2. 移动每一个“质心”。使用当前质心的所有样本计算出新的质心位置。
图3-1-3 K-means算法的直观理解

但“随机初始化”有一定的风险,因为不同的初始化会导致不同的聚类结果,所以很多迭代过程都会陷入到“局部最优解”中,如下图所示。所以解决方法就是将上述过程运行50~1000次,每次运行结束时都计算本次的代价函数,最终就可以找出代价最低的聚类结果。下面给出完整的“K-means算法”步骤:

图3-1-4 不同的初始化会导致不同的聚类结果

完整的K-means算法

  1. 设定重复次数(如100次):{
      1. 随机选择 K K K 个不同的样本作为 K K K 个质心的初始位置: μ ⃗ 1 , μ ⃗ 2 , . . . , μ ⃗ K \vec{\mu}_1,\vec{\mu}_2,...,\vec{\mu}_K μ 1,μ 2,...,μ K
      2. 然后不断重复:{
        1. 为样本分配质心。针对 m m m 个样本,重复 m m m 次,利用 X X X M \Mu M 计算出距离当前样本最近的质心索引。最后得到 c ⃗ \vec{c} c
        2. 移动质心。针对 K K K 个质心,重复 K K K 次,利用 c ⃗ \vec{c} c 计算出每个质心的新位置,并移动。质心的新位置等于该质心对应的所有样本位置的平均值。
      }直到质心不再移动或移动步长很小(收敛);
      3. 计算并保存当前结果的代价。
    }
  2. 找出代价最小的聚类结果。

注1:特征数量为 n n n、样本数量为 m m m、质心数量为 K K K
注2:运行次数超过1000后,计算成本很高,但带来的收益很小,所以一般运行50~1000次即可。
注3:下一小节介绍“代价函数”的数学形式。

最后注意,若某次迭代结束后,某质心没有被分配到样本,如下图所示,那么:

  1. 去掉一个质心,也就是令 K = K − 1 K=K-1 K=K1【常用】。
  2. 重新初始化质心位置,重新迭代。
图3-1-5 某质心没有被分配到样本

2.2 代价函数

  上述介绍的整个“K-means算法”的过程,和“梯度下降法”相似,实质上也是在寻找特定代价函数的最小值。这个代价函数就是样本和其质点的距离的平方和的平均,在某些文献中也被称为“失真函数(distoration function)”:
Cost Function/ Distoration Function : J ( c ⃗ , M ) = 1 m ∑ i = 1 m ∥ x ( i ) − μ c ( i ) ∥ 2 \begin{aligned} \text{Cost Function/} &\\ \text{Distoration Function}& \end{aligned}: J(\vec{c},\Mu) = \frac{1}{m}\sum_{i=1}^{m}\lVert x^{(i)}-\mu_{c^{(i)}} \rVert ^2 Cost Function/Distoration Function:J(c ,M)=m1i=1mx(i)μc(i)2

所以,K-means算法实际上就是想让上述的距离的平均平方和最小。每次迭代中,代价函数都应该下降或不变,若代价不变或者下降的非常小则表明算法收敛,若代价上升则意味着代码有bug。

2.3 选择聚类数量

图3-1-6 聚类数量是一个主观的指标

  由于“K-means算法”属于“无监督学习”,所以聚类数量 K K K 是很主观的指标,没有绝对正确的聚类数量。比如上图中,聚类数量是2、3、4,都非常合理。另外,聚类数量越多,代价函数的全局最小值越小,极端情况下令 K = m K=m K=m,此时每个样本都是一个类,显然代价为0最小。但通常来说,我们使用下面两种方法选择聚类数量 K K K

  1. “肘法(elbow method)”【不推荐】:画出代价函数的全局最小值 J m i n J_{min} Jmin 随着 K K K 变化的曲线,找出曲线“拐点(肘部)”所对应的 K K K 作为最佳的聚类数量。但缺点是在大多数情况下,曲线都很平滑,找不到“拐点”。
  2. 面向需求【推荐】:通常当前的算法都会有后续的应用,所以可以根据应用需求选取相应的聚类数量。比如前面的“选择T恤尺码”问题,可以看设计需要选择3种尺码还是5种尺码,当然更多的尺码也意味着更多的成本,所以可以都运行一下,综合考虑最后结果再选择聚类数量。
图3-1-7 选择聚类数量的两种方法

本节 Quiz

  1. Which of these best describes unsupervised learning?
    × A form of machine learning that finds patterns using labeled data (x,y).
    × A form of machine learning that finds patterns in data using only labels (y) but without any inputs (x).
    √ A form of machine learning that finds patterns using unlabeled data (x).
    × A form of machine learning that finds patterns without using a cost function.

  2. Which of these statements are true about K-means? Check all that apply.
    √ If you are running K-means with K = 3 K = 3 K=3 clusters, then each c ( i ) c^{(i)} c(i) should be 1,2,or3.
    √ If each example x is a vector of 5 numbers, then each cluster centroid μ k \mu_k μk is also going to be a vector of 5 numbers.
    × The number of cluster centroids μ k \mu_k μk is equal to the number of examples.
    √ The number of cluster assignment variables c ( i ) c^{(i)} c(i) is equal to the number of training examples.

  3. You run K-means 100 times with different initializations. How should you pick from the 100 resulting solutions?
    × Pick the last one (i.e., the 100th random initialization) because K-means always improves over time.
    × Average all 100 solutions together.
    × Pick randomly - that was the point of random initialization.
    √ Pick the one with the lowest cost J J J.

  4. You run K-means and compute the value of the cost function J ( c ( 1 ) , . . . , c ( m ) , μ 1 , . . . , μ k ) J(c^{(1)},...,c^{(m)},\mu_1,...,\mu_k) J(c(1),...,c(m),μ1,...,μk) after each iteration. Which of these statements should be true?
    × Because K-means tries to maximize cost, the cost is always greater than or equal to the cost in the previous iteration.
    × There is no cost function for the K-means algorithm.
    × The cost can be greater or smaller than the cost in the previous iteration, but it decreases in the long run.
    √ The cost will either decrease or stay the same after each iteration.

  5. In K-means, the elbow method is a method to
    × Choose the best number of samples in the dataset
    × Choose the maximum number of examples for each cluster
    × Choose the best random initialization
    √ Choose the number of clusters K

3. 异常检测

下面来学习第二种商业应用广泛的“无监督学习”算法——“异常检测(anomaly detection)”。

3.1 异常检测的直观理解

【问题1】“飞机引擎检测”:根据输入特征,检测新制造的引擎是否有问题。

  • 输入特征:“发动机温度”、“振动强度”。实际显然会有更多的特征,这里做出了简化。
  • 输出:是否异常。
  • 训练集: m m m 个正常引擎的特征。

【问题2】“金融欺诈监测”:持续监测用户特征,判断是否有可能的欺诈行为。

  • 输入特征:正常用户的登录频率、单次访问网页数量、单次交易数量、单次发帖数量、打字速度等。
  • 输出:查看某个新用户是否具有欺诈行为。

【问题3】“服务器监测”:监测数据中心的服务器是否正常运行。

  • 输入特征:内存使用量、磁盘读写次数、CPU负载、网络流量等。
  • 输出:判断服务器是否出现异常行为,比如被黑客攻击等。

  “异常检测”通常使用“(概率)密度估计(density estimation)”的方法。也就是,“异常检测”算法首先使用未标记的正常事件数据集进行训练(下图红叉),学习正常样本的概率分布,然后计算新样本 x t e s t x_{test} xtest 出现的概率,若其出现的概率小于设定好的阈值 p ( x t e s t ) < ε p(x_{test})<\varepsilon p(xtest)<ε,显然就可以认为这是一个异常事件:

图3-1-8 “异常检测”的直观理解

3.2 高斯分布

  由于几乎所有从自然界采集的数据都服从高斯分布,所以我们使用高斯分布进行概率密度估计,本小节就来介绍“高斯分布(Gaussian distribution)”。下面是高斯分布的性质及表达式:

  • 均值 μ \mu μ 只是沿坐标轴平移曲线,不改变曲线形状。
  • 方差 σ 2 \sigma^2 σ2 越大,曲线越扁平;方差 σ 2 \sigma^2 σ2 越小,曲线越集中。
  • 概率和为1,所以 ∫ − ∞ + ∞ p ( x ) d x = 1 \int_{-\infin}^{+\infin} p(x)dx=1 +p(x)dx=1
  • 3 σ 3\sigma 3σ原则: x x x 出现在 ( μ − 3 σ , μ + 3 σ ) (\mu-3\sigma,\mu+3\sigma) (μ3σ,μ+3σ) 以外的概率小于 0.3 % 0.3\% 0.3%,便认为是异常事件。根据精度要求,该标准可以在 3 σ ∼ 6 σ 3\sigma\sim6\sigma 3σ6σ 间浮动。

注:“高斯分布”别称“正态分布(Normal distribution)”、“钟形分布(Bell-shaped distribution)”,以下皆称“高斯分布”。

Gussion Distribution: p ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 \text{Gussion Distribution:}\quad p(x)=\frac{1}{\sqrt{2\pi}\sigma}e^{\frac{-(x-\mu)^2}{2\sigma^2}} Gussion Distribution:p(x)=2π σ1e2σ2(xμ)2

图3-1-9 高斯分布

通过上述可以看到,高斯分布由均值 μ \mu μ 和 方差 σ 2 \sigma^2 σ2 完全确定。于是针对某单个特征,我们就可以计算其均值和方差,来对当前特征进行高斯估计(假设样本 x ( i ) x^{(i)} x(i)只有一个特征):
μ = 1 m ∑ i = 1 m x ( i ) , σ 2 = 1 m ∑ i = 1 m ( x ( i ) − μ ) 2 . \mu = \frac{1}{m}\sum_{i=1}^m x^{(i)},\quad \sigma^2 = \frac{1}{m} \sum_{i=1}^m(x^{(i)}-\mu)^2. μ=m1i=1mx(i),σ2=m1i=1m(x(i)μ)2.

图3-1-10 使用高斯分布进行参数估计

3.3 异常检测算法

  于是,根据上一节对单个特征进行高斯估计的公式,可以很容易的推广到具有多特征的样本,于是就可以写出下面“异常检测”算法的完整步骤。以3.1节的“飞机引擎检测”问题举例,首先使用正常样本分别对特征 x 1 x_1 x1 x 2 x_2 x2 进行概率统计,获得整体的概率统计后,就可以直接计算 p ( x t e s t ) p(x_{test}) p(xtest) 来判断其是否为异常事件:

“异常检测”算法的完整步骤

  1. 定义训练集,注意全部为正常样本。假设样本总数为 m m m、特征总数为 n n n
  2. 对每个特征分别进行统计分析,然后将其相乘得到某样本的综合概率分布。这里假设所有特征都服从高斯分布,并且相互独立就算不独立,算法表现依旧良好
    μ j = 1 m ∑ i = 1 m x j ( i ) , σ j 2 = 1 m ∑ i = 1 m ( x j ( i ) − μ j ) 2 , j = 1 , 2 , . . . , n . p ( x ⃗ ) = p ( x 1 ; μ 1 , σ 1 2 ) ∗ p ( x 2 ; μ 2 , σ 2 2 ) ∗ . . . ∗ p ( x n ; μ n , σ n 2 ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) \mu_j = \frac{1}{m}\sum_{i=1}^m x^{(i)}_j,\quad \sigma^2_j = \frac{1}{m} \sum_{i=1}^m(x^{(i)}_j-\mu_j)^2, \quad j = 1,2,...,n.\\ p(\vec{x}) = p(x_1;\mu_1,\sigma^2_1)*p(x_2;\mu_2,\sigma^2_2)*...*p(x_n;\mu_n,\sigma^2_n) =\prod_{j=1}^n p(x_j;\mu_j,\sigma^2_j) μj=m1i=1mxj(i),σj2=m1i=1m(xj(i)μj)2,j=1,2,...,n.p(x )=p(x1;μ1,σ12)p(x2;μ2,σ22)...p(xn;μn,σn2)=j=1np(xj;μj,σj2)
  3. 对于新的输入 x ⃗ n e w \vec{x}_{new} x new,代入 p ( x ⃗ ) p(\vec{x}) p(x ) 计算其概率。若 p ( x ⃗ n e w ) < ε p(\vec{x}_{new})<\varepsilon p(x new)<ε 则认为是异常事件。
图3-1-11 “异常检测”算法——飞机引擎检测

下一小节来介绍如何选取合适的判断阈值 ε \varepsilon ε

3.4 选取判断阈值 ε \varepsilon ε

  显然在开发系统时,如果有一个具体的评估系统性能的指标,就很容易帮助我们改进系统,这就是“实数评估(real-number evaluation)”。由于 ε \varepsilon ε 也是“异常检测”的模型参数,于是这启示我们借鉴“有监督学习”中的“验证集”这一概念,来选择最合适的模型参数 ε \varepsilon ε。我们可以将“是否异常”看成是一种标签,来进行如下拆分,注意“训练集”是全部都为正常样本的无标签数据

  1. 异常样本足够】三拆分:训练集、验证集、测试集。
  • 原始训练集:10000正常样本 + 20异常样本。
  • 训练集:6000正常样本。用于拟合正常样本的概率分布。
  • 验证集:2000正常样本+10异常样本。用于挑选最合适的 ε \varepsilon ε 或者改进特征。
  • 测试集:2000正常样本+10异常样本。用于最后评估系统性能。
  1. 异常样本极少】二拆分:训练集、验证集。
  • 原始训练集:10000正常样本 + 2异常样本。
  • 训练集:6000正常样本。用于拟合正常样本的概率分布。
  • 验证集:4000正常样本+2异常样本。用于挑选最合适的 ε \varepsilon ε 或者改进特征。

注1:上述“二拆分”没有“测试集”评估系统性能,可能会有“过拟合”的风险。
注2:由于训练集没有标签,所以上述依旧是“无监督学习”。

进行上述拆分后,注意到上述“验证集”、“训练集”都属于Course2-Week3-第4节提到的“倾斜数据集”,于是就可以使用“准确率/召回率”、“F1 score”来评判系统在“验证集”、“测试集”上的性能。一个可行的代码思路是:

# 1. 训练结束后,计算验证集中所有样本对应的概率p_cv(0~1)。
# 2. 计算每个步长所对应的“F1 score”:
step = (max(p_cv) - min(p_cv)) / 1000
for epsilon in numpy.arange(min(p_cv), max(p_cv), step):# 计算当前 epsilon 下的“F1 score”
# 3. 找出最大的“F1 score”所对应的epsilon即可。

3.5 选择恰当的特征

  在“有监督学习”中,即使选取的特征没那么恰当也没关系,因为算法可以从数据集的标签中学到如何重新缩放特征。但“无监督学习”的训练集没有标签,这就意味着 相比于“有监督学习”,选择恰当的特征对于“无监督学习”来说更重要。和前面类似,改进特征的方法主要有“特征变换”、“误差分析”:

特征变换:寻找更合适的概率分布

若原始特征不是高斯分布,那显然会引入很大的误差,于是:

  1. 进行特征变换(如下图):通过数学变换将其变换成高斯分布。常见的改进方法有取对数 log ⁡ ( x + c ) \log(x+c) log(x+c) c c c为常数;幂次 x n x^{n} xn n n n为任意实数。
  2. 使用其他分布进行拟合。如下图左侧就是“对数正态分布”,其他的还有“瑞利分布”、“指数分布”等。

注:上述两种方法原理相通,只不过方法二需要了解常见的统计分布。

图3-1-12 特征变换,使其为高斯分布

误差分析

如果在“验证集”上表现不佳,那么也可以进行“误差分析”,分析出现错误的原因,对症下药进行改进:

  1. 引入新特征:比如在“金融欺诈监测”中,检查某个被遗漏的异常样本,发现指标“交易次数 x 1 x_1 x1”略高但在正常范围内,但是打字速度非常快,那么就可以添加新的特征“打字速度 x 2 x_2 x2”。
  2. 组合旧特征:比如在“服务器监测”中,检查某个被遗漏的异常样本,所有指标都在合理范围内,只是“CPU负载 x 3 x_3 x3”略高且“网络流量 x 4 x_4 x4”略低,那么就可以组合这两个特征“CPU负载/网络流量 x 5 x_5 x5”。
图3-1-13 改进特征的两种方法

3.6 异常检测与有监督学习对比

  既然3.4节引入了“验证集”,将异常样本标记为1、正常样本标记为0,那为什么不使用前面的“有监督学习”完成检测异常样本的任务呢?这是因为两者的问题重心不同。总结一句话,“异常检测”尝试检测出“新异常”;“有监督学习”只检测“旧异常。下面给出两者的对比:

异常检测-无监督学习

  • 异常样本极少。
  • 异常的种类很多,异常样本无法覆盖到所有的异常;并且时常出现“新异常”。
  • 如“金融欺诈监测”,每隔几个月都会出现全新的欺诈策略。
  • 如“飞机引擎检测”,希望能检测到全新的缺陷。
  • 如“服务器监测”,因为有人维护,所以黑客每次的入侵方式都不一样。许多系统安全相关的软件都使用“异常检测”。

有监督学习

  • 异常样本很多,甚至和正常样本一样多。
  • 异常样本覆盖全面,以后出现的异常几乎都是之前出现过的
  • 如“垃圾邮件分类器”,内容无外乎保险、毒品、商品推销等。
  • 如“产品缺陷检测”,流水线产品的缺陷几乎已经都是固定种类的,比如擦痕检测。
  • 如“天气预报”,因为天气的种类是固定的:晴天、雨天等。
  • 如“疾病检测”,看看病人是否有特定类型的疾病。

本节 Quiz

  1. You are building a system to detect if computers in a data center are malfunctioning. You have 10,000 data points of computers functioning well, and no data from computers malfunctioning. What type of algorithm should you use?
    √ Anomaly detection
    × Supervised learning

  2. You are building a system to detect if computers in a data center are malfunctioning. You have 10,000 data points of computers functioning well, and 10,000 data points of computers malfunctioning. What type of algorithm should you use?
    × Anomaly detection
    √ Supervised learning

  3. Say you have 5,000 examples of normal airplane engines, and 15 examples of anomalous engines. How would you use the 15 examples of anomalous engines to evaluate your anomaly detection algorithm?
    × Because you have data of both normal and anomalous engines, don’t use anomaly detection. Use supervised learning instead.
    × You cannot evaluate an anomaly detection algorithm because it is an unsupervised learning algorithm.
    √ Put the data of anomalous engines (together with some normal engines) in the cross-validation and/or test sets to measure if the learned model can correctly detect anomalous engines.
    × Use it during training by ftting one Gaussian model to the normal engines, and a different Gaussian model to the anomalous engines.

  4. Anomaly detection flags a new input x x x as an anomaly if p ( x ) < ε p(x) < \varepsilon p(x)<ε. If we reduce the value of ε \varepsilon ε, what happens?
    × The algorithm is more likely to classify new examples as an anomaly.
    √ The algorithm is less likely to classify new examples as an anomaly.
    × The algorithm is more likely to classify some examples as an anomaly, and less likely to classify some examples as an anomaly. It depends on the example x x x.
    × The algorithm will automatically choose parameters μ \mu μ and σ \sigma σ to decrease p ( x ) p(x) p(x) and compensate.

  5. You are monitoring the temperature and vibration intensity on newly manufactured aircraft engines. You have measured 100 engines and fit the Gaussian model described in the video lectures to the data. The 100 examples and the resulting distributions are shown in the figure below.
    The measurements on the latest engine you are testing have a temperature of 17.5 and a vibration intensity of 48. These are shown in magenta on the figure below. What is the probability of an engine having these two measurements?
    Answer: 0.0738*0.02288 = 0.00169

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

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

相关文章

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…

【京东服装推荐系统 - 数据爬取、可视化和个性化推荐】

京东服装推荐系统 - 数据爬取、可视化和个性化推荐 前言数据集与数据爬取数据分析与可视化Django搭建可视化平台主要功能1. 数据可视化2. 我的收藏3. 商品推荐4. 登录注册5. 信息展示6. 信息管理7. 对数据的收藏8. 推荐 创新点结语 前言 在现今的电商市场中&#xff0c;服装领…

鸿蒙原生应用/元服务开发-新版本端云一体化模板体验反馈

一、前言 云端一体化模板是基于Serverless服务构建的一套模板&#xff0c;提供了应用生态常见场景需求的代码实现&#xff0c;开发者可将所需能力快速部署和集成到自己的应用中。 二、准备 体验最新的远端一体化模板&#xff0c;需要将云模板替换掉。为此&#xff0c;我们需要做…

我对迁移学习的一点理解——领域适应(系列3)

文章目录 1. 领域适应&#xff08;Domain Adaptation&#xff09;的基本概念2.领域适应&#xff08;Domain Adaptation&#xff09;的目标3.领域适应&#xff08;Domain Adaptation&#xff09;的实现方法4.领域适应&#xff08;Domain Adaptation&#xff09;的可以解决的问题…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…

这嵌入式“玩具”也太酷了吧~

大家周末好&#xff0c;我是bug菌&#xff5e; 今天看到有朋友晒出了一个“玩具”&#xff0c;实在是太酷了&#xff0c;嵌入式开发人员谁不爱&#xff1f;于是去了解了下&#xff0c;顺便分享给大家&#xff5e; 这机器是clockwork推出的uconsole,console大家这应该很熟悉&…

Leetcode刷题笔记题解(C++):92. 反转链表 II

思路&#xff1a;获取要反转的区间&#xff0c;拆开之后进行反转再拼接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

【Linux】stat命令使用

stat命令 stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。 著者 由Michael Meskes撰写。 stat命令 -Linux手册页 语法 stat [文件或目录] 命令选项及作用 执行令 &#xff1a; stat --help 执行命令结果 参数 -L、 --dereference 跟…

Star CCM+ 停止并保存用命令行运行的计算

在 StarCCM 命令行运行 中介绍了命令行运行计算的方法&#xff0c;有网友询问停止计算的命令&#xff0c;但计算一旦提交之后应该是不能用命令结束的&#xff0c;除非是用 kill 或任务管理器直接结束进程。然而&#xff0c;直接结束进程不会自动保存计算结果。 问题 通常情况下…

lv12 系统移植导学 1

1 导学 Kernel学习主要包括三块内容&#xff0c;ARM&#xff08;汇编、协议&#xff09;、系统移植、驱动移植 lv12主要时安装系统linux linux主要帮我们实现了5大功能 1 进程、线程管理 2 内存管理 3 网络协议栈管理 4 文件系统管理 5 设备管理 2 移植的目的 不同架构…

【数据结构】——排序篇(下)

前言&#xff1a;前面我们的排序已经详细的讲解了一系列的方法&#xff0c;那么我们现在久之后一个归并排序了&#xff0c;所以我们现在就来讲解一下归并排序。 归并排序&#xff1a; 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法…

代码随想录二刷 |二叉树 | 二叉树的右视图

代码随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉树的右视图 题目描述解题思路代码实现 题目描述 199.二叉树的右视图 给定一个二叉树的 根节点 root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例…

表格的介绍与实战(详细且有案例)

目录​​​​​​​​​​​​​​ 表格的主要作用&#xff1a; 表格的基本语法&#xff1a; 表格相关的标签 合并单元格&#xff1a; 实战&#xff1a; 表格的主要作用&#xff1a; 表格主要是用来展示数据的&#xff0c;使用表格来展示数据&#xff0c;数据可读性更好…

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制

202301209将RK3399的挖掘机开发板在Android10下设置系统默认为24小时制 2023/12/9 22:07 应该也可以适用于RK3399的Android12系统 --- a/frameworks/base/packages/SettingsProvider/res/values/defaults.xml b/frameworks/base/packages/SettingsProvider/res/values/default…

一文搞懂Lombok Plugins使用与原理

目录 一文搞懂Lombok使用与原理 1.前言2.什么是Lombok3. IntelliJ安装Lombok3.1通过IntelliJ的插件中心安装3.2在项目中使用Lombok Plugins 4.Lombok 注解大全说明4.1POJO类常用注解4.2其他注解 5.Lombok常见问题6.总结7.参考 文章所属专区 超链接 1.前言 2.什么是Lombok Lo…

产品创新受赞誉,怿星荣获2023未来汽车(电子和软件)创新创业大赛一等奖

2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛 11月29日&#xff0c;上海临港&#xff0c;由中国汽车工程学会和中国&#xff08;上海&#xff09;自由贸易试验区临港新片区管理委员会联合举办的“2023未来汽车&#xff08;电子和软件&#xff09;创新创业大赛…

二叉搜索树中第K小的元素[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉搜索树的根节点root&#xff0c;和一个整数k&#xff0c;请你设计一个算法查找其中第k个最小元素&#xff08;从1开始计数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,1,4,null,2], k 1 输出&#x…

RHEL8_Linux硬盘管理

主要介绍Linux磁盘管理 了解分区的概念对硬盘进行分区常见的分区swap分区的管理 1.了解分区的概念 1&#xff09;新的硬盘首先需要对其进行分区和格式化&#xff0c;下面来了解以下硬盘的结构&#xff0c;如图。 2&#xff09;硬盘的磁盘上有一个个圈&#xff0c;每两个圈组…

JVM虚拟机系统性学习-类加载子系统

类加载子系统 类加载的时机 类加载的时机主要有 4 个&#xff1a; 遇到 new、getstatic、putstatic、invokestatic 这四条字节码指令时&#xff0c;如果对应的类没有初始化&#xff0c;则要先进行初始化 new 关键字创建对象时读取或设置一个类型的静态字段时&#xff08;被 …