第16章 主成分分析:四个案例及课后习题

news2024/10/2 8:36:25

1.假设 x x x m m m 维随机变量,其均值为 μ \mu μ,协方差矩阵为 Σ \Sigma Σ

考虑由 m m m维随机变量 x x x m m m维随机变量 y y y的线性变换
y i = α i T x = ∑ k = 1 m α k i x k , i = 1 , 2 , ⋯   , m y _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , m yi=αiTx=k=1mαkixk,i=1,2,,m

其中 α i T = ( α 1 i , α 2 i , ⋯   , α m i ) \alpha _ { i } ^ { T } = ( \alpha _ { 1 i } , \alpha _ { 2 i } , \cdots , \alpha _ { m i } ) αiT=(α1i,α2i,,αmi)

如果该线性变换满足以下条件,则称之为总体主成分:

(1) α i T α i = 1 , i = 1 , 2 , ⋯   , m \alpha _ { i } ^ { T } \alpha _ { i } = 1 , i = 1,2 , \cdots , m αiTαi=1,i=1,2,,m

(2) cov ⁡ ( y i , y j ) = 0 ( i ≠ j ) \operatorname { cov } ( y _ { i } , y _ { j } ) = 0 ( i \neq j ) cov(yi,yj)=0(i=j);

(3)变量 y 1 y_1 y1 x x x的所有线性变换中方差最大的; y 2 y_2 y2是与 y 1 y_1 y1不相关的 x x x的所有线性变换中方差最大的;一般地, y i y_i yi是与 y 1 , y 2 , ⋯   , y i − 1 , ( i = 1 , 2 , ⋯   , m ) y _ { 1 } , y _ { 2 } , \cdots , y _ { i - 1 } , ( i = 1,2 , \cdots , m ) y1,y2,,yi1,(i=1,2,,m)都不相关的 x x x的所有线性变换中方差最大的;这时分别称 y 1 , y 2 , ⋯   , y m y _ { 1 } , y _ { 2 } , \cdots , y _ { m } y1,y2,,ym x x x的第一主成分、第二主成分、…、第 m m m主成分。

2.假设 x x x m m m维随机变量,其协方差矩阵是 Σ \Sigma Σ Σ \Sigma Σ的特征值分别是 λ 1 ≥ λ 2 ≥ ⋯ ≥ λ m ≥ 0 \lambda _ { 1 } \geq\lambda _ { 2 } \geq \cdots \geq \lambda _ { m } \geq 0 λ1λ2λm0,特征值对应的单位特征向量分别是 α 1 , α 2 , ⋯   , α m \alpha _ { 1 } , \alpha _ { 2 } , \cdots , \alpha _ { m } α1,α2,,αm,则 x x x的第2主成分可以写作

y i = α i T x = ∑ k = 1 m α k i x k , i = 1 , 2 , ⋯   , m y _ { i } = \alpha _ { i } ^ { T } x = \sum _ { k = 1 } ^ { m } \alpha _ { k i } x _ { k } , \quad i = 1,2 , \cdots , m yi=αiTx=k=1mαkixk,i=1,2,,m
并且, x x x的第 i i i主成分的方差是协方差矩阵 Σ \Sigma Σ的第 i i i个特征值,即 var ⁡ ( y i ) = α i T Σ α i = λ i \operatorname { var } ( y _ { i } ) = \alpha _ { i } ^ { T } \Sigma \alpha _ { i } = \lambda _ { i } var(yi)=αiTΣαi=λi

3.主成分有以下性质:

主成分 y y y的协方差矩阵是对角矩阵 cov ⁡ ( y ) = Λ = diag ⁡ ( λ 1 , λ 2 , ⋯   , λ m ) \operatorname { cov } ( y ) = \Lambda = \operatorname { diag } ( \lambda _ { 1 } , \lambda _ { 2 } , \cdots , \lambda _ { m } ) cov(y)=Λ=diag(λ1,λ2,,λm)

主成分 y y y的方差之和等于随机变量 x x x的方差之和
∑ i = 1 m λ i = ∑ i = 1 m σ i i \sum _ { i = 1 } ^ { m } \lambda _ { i } = \sum _ { i = 1 } ^ { m } \sigma _ { i i } i=1mλi=i=1mσii
其中 σ i i \sigma _ { i i } σii x 2 x_2 x2的方差,即协方差矩阵 Σ \Sigma Σ的对角线元素。

主成分 y k y_k yk与变量 x 2 x_2 x2的相关系数 ρ ( y k , x i ) \rho ( y _ { k } , x _ { i } ) ρ(yk,xi)称为因子负荷量(factor loading),它表示第 k k k个主成分 y k y_k yk与变量 x x x的相关关系,即 y k y_k yk x x x的贡献程度。
ρ ( y k , x i ) = λ k α i k σ i i , k , i = 1 , 2 , ⋯   , m \rho ( y _ { k } , x _ { i } ) = \frac { \sqrt { \lambda _ { k } } \alpha _ { i k } } { \sqrt { \sigma _ { i i } } } , \quad k , i = 1,2 , \cdots , m ρ(yk,xi)=σii λk αik,k,i=1,2,,m

4.样本主成分分析就是基于样本协方差矩阵的主成分分析。

给定样本矩阵
X = [ x 1 x 2 ⋯ x n ] = [ x 11 x 12 ⋯ x 1 n x 21 x 22 ⋯ x 2 n ⋮ ⋮ ⋮ x m 1 x m 2 ⋯ x m n ] X = \left[ \begin{array} { l l l l } { x _ { 1 } } & { x _ { 2 } } & { \cdots } & { x _ { n } } \end{array} \right] = \left[ \begin{array} { c c c c } { x _ { 11 } } & { x _ { 12 } } & { \cdots } & { x _ { 1 n } } \\ { x _ { 21 } } & { x _ { 22 } } & { \cdots } & { x _ { 2 n } } \\ { \vdots } & { \vdots } & { } & { \vdots } \\ { x _ { m 1 } } & { x _ { m 2 } } & { \cdots } & { x _ { m n } } \end{array} \right] X=[x1x2xn]= x11x21xm1x12x22xm2x1nx2nxmn

其中 x j = ( x 1 j , x 2 j , ⋯   , x m j ) T x _ { j } = ( x _ { 1 j } , x _ { 2 j } , \cdots , x _ { m j } ) ^ { T } xj=(x1j,x2j,,xmj)T x x x的第 j j j个独立观测样本, j = 1 , 2 , … , n j=1,2,…,n j=1,2,n

X X X的样本协方差矩阵
S = [ s i j ] m × m , s i j = 1 n − 1 ∑ k = 1 n ( x i k − x ‾ i ) ( x j k − x ‾ j ) i = 1 , 2 , ⋯   , m , j = 1 , 2 , ⋯   , m \left. \begin{array} { c } { S = [ s _ { i j } ] _ { m \times m } , \quad s _ { i j } = \frac { 1 } { n - 1 } \sum _ { k = 1 } ^ { n } ( x _ { i k } - \overline { x } _ { i } ) ( x _ { j k } - \overline { x } _ { j } ) } \\ { i = 1,2 , \cdots , m , \quad j = 1,2 , \cdots , m } \end{array} \right. S=[sij]m×m,sij=n11k=1n(xikxi)(xjkxj)i=1,2,,m,j=1,2,,m

给定样本数据矩阵 X X X,考虑向量 x x x y y y的线性变换 y = A T x y = A ^ { T } x y=ATx
这里
A = [ a 1 a 2 ⋯ a m ] = [ a 11 a 12 ⋯ a 1 m a 21 a 22 ⋯ a 2 m ⋮ ⋮ ⋮ a m 1 a m 2 ⋯ a m m ] A = \left[ \begin{array} { l l l l } { a _ { 1 } } & { a _ { 2 } } & { \cdots } & { a _ { m } } \end{array} \right] = \left[ \begin{array} { c c c c } { a _ { 11 } } & { a _ { 12 } } & { \cdots } & { a _ { 1 m } } \\ { a _ { 21 } } & { a _ { 22 } } & { \cdots } & { a _ { 2 m } } \\ { \vdots } & { \vdots } & { } & { \vdots } \\ { a _ { m 1 } } & { a _ { m 2 } } & { \cdots } & { a _ { m m } } \end{array} \right] A=[a1a2am]= a11a21am1a12a22am2a1ma2mamm

如果该线性变换满足以下条件,则称之为样本主成分。样本第一主成分 y 1 = a 1 T x y _ { 1 } = a _ { 1 } ^ { T } x y1=a1Tx是在 a 1 T a 1 = 1 a _ { 1 } ^ { T } a _ { 1 } = 1 a1Ta1=1条件下,使得 a 1 T x j ( j = 1 , 2 , ⋯   , n ) a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n ) a1Txj(j=1,2,,n)的样本方差 a 1 T S a 1 a _ { 1 } ^ { T } S a _ { 1 } a1TSa1最大的 x x x的线性变换;

样本第二主成分 y 2 = a 2 T x y _ { 2 } = a _ { 2 } ^ { T } x y2=a2Tx是在 a 2 T a 2 = 1 a _ { 2 } ^ { T } a _ { 2 } = 1 a2Ta2=1 a 2 T x j a _ { 2 } ^ { T } x _ { j } a2Txj a 1 T x j ( j = 1 , 2 , ⋯   , n ) a _ { 1 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n ) a1Txj(j=1,2,,n)的样本协方差 a 1 T S a 2 = 0 a _ { 1 } ^ { T } S a _ { 2 } = 0 a1TSa2=0条件下,使得 a 2 T x j ( j = 1 , 2 , ⋯   , n ) a _ { 2 } ^ { T } x _ { j } ( j = 1,2 , \cdots , n ) a2Txj(j=1,2,,n)的样本方差 a 2 T S a 2 a _ { 2 } ^ { T } S a _ { 2 } a2TSa2最大的 x x x的线性变换;

一般地,样本第 i i i主成分 y i = a i T x y _ { i } = a _ { i } ^ { T } x yi=aiTx是在 a i T a i = 1 a _ { i } ^ { T } a _ { i } = 1 aiTai=1 a i T x j a _ { i } ^ { T } x _ { j } aiTxj a k T x j ( k < i , j = 1 , 2 , ⋯   , n ) a _ { k } ^ { T } x _ { j } ( k < i , j = 1,2 , \cdots , n ) akTxj(k<i,j=1,2,,n)的样本协方差 a k T S a i = 0 a _ { k } ^ { T } S a _ { i } = 0 akTSai=0条件下,使得 a i T x j ( j = 1 , 2 , ⋯   , n ) a _ { i } ^ { T } x _ { j } ( j = 1,2 , \cdots , n ) aiTxj(j=1,2,,n)的样本方差 a k T S a i a _ { k } ^ { T } S a _ { i } akTSai最大的 x x x的线性变换。

5.主成分分析方法主要有两种,可以通过相关矩阵的特征值分解或样本矩阵的奇异值分解进行。

(1)相关矩阵的特征值分解算法。针对 m × n m \times n m×n样本矩阵 X X X,求样本相关矩阵
R = 1 n − 1 X X T R = \frac { 1 } { n - 1 } X X ^ { T } R=n11XXT
再求样本相关矩阵的 k k k个特征值和对应的单位特征向量,构造正交矩阵
V = ( v 1 , v 2 , ⋯   , v k ) V = ( v _ { 1 } , v _ { 2 } , \cdots , v _ { k } ) V=(v1,v2,,vk)

V V V的每一列对应一个主成分,得到 k × n k \times n k×n样本主成分矩阵
Y = V T X Y = V ^ { T } X Y=VTX

(2)矩阵 X X X的奇异值分解算法。针对 m × n m \times n m×n样本矩阵 X X X
X ′ = 1 n − 1 X T X ^ { \prime } = \frac { 1 } { \sqrt { n - 1 } } X ^ { T } X=n1 1XT
对矩阵 X ′ X ^ { \prime } X进行截断奇异值分解,保留 k k k个奇异值、奇异向量,得到
X ′ = U S V T X ^ { \prime } = U S V ^ { T } X=USVT
V V V的每一列对应一个主成分,得到 k × n k \times n k×n样本主成分矩阵 Y Y Y
Y = V T X Y = V ^ { T } X Y=VTX

案例1:高维数据的可视化

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
from matplotlib_inline import backend_inline

backend_inline.set_matplotlib_formats('svg')

iris = load_iris()
X = iris.data  # 形状(150,4)
y = iris.target

pca = PCA(n_components=2)
X_dr = pca.fit_transform(X)
# print(X_dr) # 形状(150,2)

colors = ['red', 'black', 'orange']
plt.figure()
for i in range(3):
    plt.scatter(X_dr[y == i, 0],
                X_dr[y == i, 1],
                c=colors[i],
                alpha=0.7,
                label=iris.target_names[i])
plt.legend()
plt.title('PCA of IRIS dataset')
plt.show()

# 一些关键信息
print('各主成分的方差(即协方差矩阵的特征值):', pca.explained_variance_, '\n特征向量:',
      pca.components_, '\n可解释性方差贡献率:', pca.explained_variance_ratio_,
      '\n保留了原数据多少信息(累计方差贡献率):', pca.explained_variance_ratio_.sum())

在这里插入图片描述

各主成分的方差(即协方差矩阵的特征值): [4.22824171 0.24267075] 
特征向量: [[ 0.36138659 -0.08452251  0.85667061  0.3582892 ]
 [ 0.65658877  0.73016143 -0.17337266 -0.07548102]] 
可解释性方差贡献率: [0.92461872 0.05306648] 
保留了原数据多少信息(累计方差贡献率): 0.977685206318795

接下来说明选择主成分个数(n_components)的一些方法

# 法一:选择累计方差贡献率曲线的突然变平坦的点对应的主成分个数
pca_ = PCA(n_components=4).fit(X)
plt.plot(range(1, 5), np.cumsum(pca_.explained_variance_ratio_))
plt.xticks([1, 2, 3, 4])
plt.show()  # 故选择主成分个数为2较合适

在这里插入图片描述

# 法二:令n_components='mle'使用极大似然估计 自动选择主成分个数
pca_mle = PCA(n_components='mle').fit(X)
X_mle = pca_mle.fit_transform(X)
print(X_mle.shape, pca_mle.explained_variance_ratio_.sum())
# 可以看出这种方法选择主成分的个数为3
(150, 3) 0.9947878161267247
# 法三:输出浮点数n_components=0.9按信息量占比选择主成分个数
# 确保选择的主成分能够解释至少 97% 的数据方差,并使用 完全SVD方法 进行计算
pca_3 = PCA(n_components=0.97, svd_solver="full").fit(X)
X_3 = pca_3.fit_transform(X)
print(X_3.shape, pca_3.explained_variance_ratio_.sum()) # 选择两个主成分个数就能包含原数据信息97%以上了
(150, 2) 0.977685206318795

svd_solver 参数决定了计算主成分的奇异值分解 (SVD) 方法。以下是 svd_solver 参数的可选值及其含义:

  • auto:默认值。根据输入数据的大小和所需的主成分数量,自动选择合适的 SVD 方法。
  • full:使用标准的完全 SVD 方法。这种方法比较慢,但适用于所有情况,特别是当数据矩阵的形状为 n_samples > n_features 或 n_features > n_samples 时。
  • arpack:使用 scipy.sparse.linalg.svds 实现的截断 SVD。这种方法适合计算少数几个主成分的情况,特别是当所需的主成分数远小于数据矩阵的形状时。
  • randomized:使用随机 SVD 方法,适用于大数据集,且需要计算的主成分数不多的情况。这种方法通常比完全 SVD 方法快很多。

案例2:人脸识别

import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import fetch_lfw_people
from matplotlib_inline import backend_inline

# 设置 matplotlib 的显示格式为 SVG 矢量图
backend_inline.set_matplotlib_formats('svg')

# 获取 LFW (Labeled Faces in the Wild) 数据集
faces = fetch_lfw_people(min_faces_per_person=60)
# 数据集包含每个人至少 60 张脸部图像

# 查看数据集的形状
# print(faces.images.shape) # (1348, 62, 47)
# 62 是每个图像的行数,47 是每个图像的列数,因此每个图像有 62*47 = 2914 个像素
# 数据集中共有 1348 张图像

# print(faces.data.shape) # (1348, 2914)
# 数据集的形状为 (1348, 2914),表示有 1348 个样本,每个样本有 2914 个特征(像素值)

# 创建图像网格,显示前 24 张图像,每个子图不显示坐标轴刻度
fig, axes = plt.subplots(3, 8, figsize=(8, 4), subplot_kw={"xticks": [], "yticks": []})
for i, ax in enumerate(axes.flat): # axes 是一个 3x8 的数组,包含了 24 个 AxesSubplot 对象。axes.flat 将其展开为一个一维数组
    ax.imshow(faces.images[i, :, :], cmap='gray') # 获取第 i 张图像,这是一张 2D 数组(灰度图像)

plt.show()

在这里插入图片描述

# 原本有2914维,现在试着降到200维

# 将数据矩阵 X 定义为 faces 数据集的 data 属性
X = faces.data # # (1348, 2914)
pca_face = PCA(n_components=200).fit(X)
X_face=pca_face.fit_transform(X) # (1384,200)
V = pca_face.components_
print('奇异值分解中的V的形状(即特征矩阵):', V.shape, '\n200个主成分保留了原数据多少信息(累计方差贡献率):',
      pca_face.explained_variance_ratio_.sum())

fig, axes = plt.subplots(3, 8, figsize=(8, 4), subplot_kw={"xticks": [], "yticks": []})
for i, ax in enumerate(axes.flat): 
    ax.imshow(V[i, :].reshape(62,47), cmap='gray') # 可见第一主成分(第一张图)获取的是人的轮廓信息,其他主成分不好解释……

# 使用inverse_transform可以逆转回去(但这种逆转不是完全可逆的,毕竟降维时只使用了200个主成分)
X_inv=pca_face.inverse_transform(X_face)

# 可视化逆转回的数据
fig, ax = plt.subplots(2, 8, figsize=(8, 2.5), subplot_kw={"xticks": [], "yticks": []})
# 现在的ax中是2行8列,作为对比:第一行是原数据,第二行是inverse_transform后返回的数据
# 一次循环画同一列上的两张图,而不是把ax拉平
for i in range(8):
    ax[0, i].imshow(faces.images[i, :, :], cmap="binary_r")
    ax[1, i].imshow(X_inv[i].reshape(62, 47), cmap="binary_r")
plt.show()
奇异值分解中的V的形状(即特征矩阵): (200, 2914) 
200个主成分保留了原数据多少信息(累计方差贡献率): 0.9420423

在这里插入图片描述

在这里插入图片描述

案例3:用PCA做噪音过滤(手写数字识别)

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np

digits = load_digits()
# digits.data.shape  # (1797,64)


# 定义一个画图的函数
def plot_digits(data):
    fig, axes = plt.subplots(4, 10, figsize=(10, 4), subplot_kw={"xticks": [], "yticks": []})
    for i, ax in enumerate(axes.flat):
        ax.imshow(data[i].reshape(8, 8), cmap="binary")
    plt.show()

plot_digits(digits.data)

在这里插入图片描述

# 将均值为0、标准差为2的正态分布随机数添加到 digits.data 中,从而人为创建一个带有噪声的新数据集 noisy
np.random.RandomState(42)
noisy = np.random.normal(digits.data, 2)
plot_digits(noisy)

在这里插入图片描述

# 利用PCA的inverse_transform函数去噪
pca_digits = PCA(n_components=0.7, svd_solver="full").fit(noisy)
noisy_ = pca_digits.fit_transform(noisy)
no_noisy_data = pca_digits.inverse_transform(noisy_)
plot_digits(no_noisy_data)

在这里插入图片描述

案例4:手写数字识别

对于某些算法,如果数据维度过大那么运行时间将会非常久,例如KNN。故利用PCA把原数据进行降维后再运用其他算法进行后续工作是常见的做法。本处案例进行手写数字识别。

from sklearn.decomposition import PCA
from sklearn.ensemble import RandomForestClassifier as RFC
from sklearn.neighbors import KNeighborsClassifier as KNN
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的负号的乱码问题

data = pd.read_csv("D:/PycharmProjects/ML20230605/机器学习/3、数据预处理与特征工程/digit recognizor.csv")
X = data.iloc[:, 1:] # (42000,784)
y = data.iloc[:, 0]

# 选择主成分个数,先设置200观察一下图像
pca_line = PCA(n_components=200).fit(X)
plt.figure(figsize=[20, 5])
plt.plot(np.cumsum(pca_line.explained_variance_ratio_))
plt.xlabel("主成分个数")
plt.ylabel("累计方差贡献率")
plt.show()

在这里插入图片描述

# 看图,缩小主成分范围。使用随机森林和KNN建模
# score_r = []
score_knn = []
for i in range(25, 30):
    X_dr = PCA(n_components = i).fit_transform(X)
#     once_r = cross_val_score(RFC(n_estimators=10, random_state=0), X_dr, y, cv=5).mean()
    once_knn = cross_val_score(KNN(), X_dr, y, cv=5).mean() 
#     score_r.append(once_r)
    score_knn.append(once_knn)
plt.figure(figsize=[20, 5])
# plt.plot(range(25, 30), score_r)
plt.plot(range(25, 30), score_knn)
plt.show() # 于是选择29作为主成分个数

在这里插入图片描述

X_dr=PCA(n_components=29).fit_transform(X)
print(cross_val_score(KNN(), X_dr, y, cv=5).mean()) # KNN未进行任何调参时

# 对KNN模型进行调参
score = []
for i in range(3,10):
    once = cross_val_score(KNN(i), X_dr, y, cv=5).mean()
    score.append(once)
plt.figure(figsize=[20, 5])
plt.plot(range(3,10), score)
plt.show() # 发现K=5时准确率最高,其实这就是KNN的默认参数
0.9720952380952381

在这里插入图片描述

习题

在这里插入图片描述

16.1
import numpy as np
from sklearn.decomposition import PCA

# 定义数据矩阵
X = np.array([[2, 3, 3, 4, 5, 7], [2, 4, 5, 5, 6, 8]])
X = X.astype("float64")

# 规范化变量
avg = np.average(X, axis=1)
var = np.var(X, axis=1)
for i in range(X.shape[0]):
    X[i] = (X[i, :] - avg[i]) / np.sqrt(var[i])

# 使用PCA类
pca = PCA(n_components=2)

# 拟合数据并转换
X_pca = pca.fit_transform(X.T)

# 打印结果
print("特征向量 V:\n", pca.components_.T) # pca.components_ 属性返回的是形状为 (n_components, n_features) 的矩阵
print("样本主成分矩阵 Y:\n", X_pca.T)

# 使用自定义的pca_svd函数
def pca_svd(X, k):
    """
    样本矩阵的奇异值分解的主成分分析算法
    :param X: 样本矩阵X
    :param k: 主成分个数k
    :return: 特征向量V,样本主成分矩阵Y
    """
    n_samples = X.shape[1]  # 这里的X矩阵的一列表示一个观测

    # 构造新的n×m矩阵
    T = X.T / np.sqrt(n_samples - 1)

    # 对矩阵T进行截断奇异值分解
    U, S, Vt = np.linalg.svd(T)
    V = Vt.T[:, :k]

    # 求k×n的样本主成分矩阵
    return V, np.dot(V.T, X)

# 设置精度为3
np.set_printoptions(precision=3, suppress=True)
V, vnk = pca_svd(X, 2)

print("正交矩阵V:")
print(V)
print("样本主成分矩阵Y:")
print(vnk)
特征向量 V:
 [[ 0.707 -0.707]
 [ 0.707  0.707]]
样本主成分矩阵 Y:
 [[-2.028 -0.82  -0.433 -0.     0.82   2.461]
 [-0.296  0.046  0.433  0.    -0.046 -0.137]]
正交矩阵V:
[[ 0.707  0.707]
 [ 0.707 -0.707]]
样本主成分矩阵Y:
[[-2.028 -0.82  -0.433  0.     0.82   2.461]
 [ 0.296 -0.046 -0.433  0.     0.046  0.137]]
16.2、16.3

见该链接

使用书籍:李航《机器学习方法》
习题解答:https://datawhalechina.github.io/statistical-learning-method-solutions-manual/#/

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

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

相关文章

从微软 Word 中提取数据

从 Microsoft Word 文档中提取数据可以通过编程来实现&#xff0c;有几种常见的方法&#xff0c;其中之一是使用 Python 和 python-docx 库。python-docx 是一个处理 .docx 文件&#xff08;Microsoft Word 文档&#xff09;的 Python 库&#xff0c;可以读取和操作 Word 文档的…

泛微开发修炼之旅--36通过js控制明细表中同一列中多个浏览框的显示控制逻辑(明细表列中多字段显示逻辑控制)

文章链接&#xff1a;36通过js控制明细表中同一列中多个浏览框的显示控制逻辑&#xff08;明细表列中多字段显示逻辑控制&#xff09;

谷粒商城学习笔记-22-分布式组件-SpringCloud-OpenFeign测试远程调用

文章目录 一&#xff0c;OpenFeign的简介二&#xff0c;OpenFeign的使用步骤1&#xff0c;场景说明2&#xff0c;引入依赖2&#xff0c;开启OpenFeign3&#xff0c;编写Feign接口4&#xff0c;使用feign调用远程接口5&#xff0c;验证 错误记录 上一节学习了注册中心&#xff0…

变长输入神经网络设计

我对使用 PyTorch 可以轻松构建动态神经网络的想法很感兴趣&#xff0c;因此我决定尝试一下。 我脑海中的应用程序具有可变数量的相同类型的输入。对于可变数量的输入&#xff0c;已经使用了循环或递归神经网络。但是&#xff0c;这些结构在给定行的输入之间施加了一些顺序或层…

前端面试题31(TCP与UDP区别)

TCP (Transmission Control Protocol) 和 UDP (User Datagram Protocol) 是两种在网络通信中常用的传输层协议&#xff0c;它们在多个方面存在显著差异&#xff0c;主要体现在以下几个方面&#xff1a; 连接方式&#xff1a; TCP 是面向连接的协议。在数据传输开始之前&#xf…

STM32学习历程(day6)

EXTI外部中断使用教程 首先先看下EXTI的框图 看这个框图就能知道要先初始化GPIO外设 那么和前面一样 1、先RCC使能时钟 2、配置GPIO 选择端口为输入模式&#xff0c; 3、配置AFIO&#xff0c;选择我们用的GPIO连接到后面的EXTI 4、配置EXTI&#xff0c;选择边沿触发方式…

前端javascript中的排序算法之选择排序

选择排序&#xff08;Selection Sort&#xff09;基本思想&#xff1a; 是一种原址排序法&#xff1b; 将数组分为两个区间&#xff1a;左侧为已排序区间&#xff0c;右侧为未排序区间。每趟从未排序区间中选择一个值最小的元素&#xff0c;放到已排序区间的末尾&#xff0c;从…

从Helm到 Operator:Kubernetes应用管理的进化

&#x1f9f0;Helm 的作用 在开始前需要先对 kubernetes Operator 有个简单的认识。 以为我们在编写部署一些简单 Deployment 的时候只需要自己编写一个 yaml 文件然后 kubectl apply 即可。 apiVersion: apps/v1 kind: Deployment metadata: labels: app: k8s-combat …

Camera Raw:常规工具

在 Camera Raw 窗口右下角提供了四个常用的工具&#xff0c;它们分别是&#xff1a;缩放工具、抓手工具、切换取样器叠加以及切换网格叠加工具。 ◆ ◆ ◆ 缩放工具 Zoom Tool 用于放大或缩小预览图像&#xff0c;便于查看和编辑细节。 快捷键&#xff1a;Z 1、双击“缩放工具…

jvm 06 对象内存结构,指针压缩,调优

01 内存布局 mark word 32bit 4B 64bit 8B 类型指针 klass pointer 开启指针压缩 4B 关闭指针压缩 8B 数组长度 4B 没有这个区域 实例数据 bool 1B 1 true&#xff0c;0 false #define TRUE 1 byte 1B char 2B 1B int 4B float 4B long 8B double 8B 引用类型 开启指针压缩 4B …

部署前端项目

常见部署方式有&#xff1a;静态托管服务、服务器部署 1. 静态托管服务 使用平台部署代码&#xff0c;比如 GitHub。 | 创建一个仓库&#xff0c;仓库名一般是 yourGithubName.github.io。 | 将打包后的静态文件文件上传到仓库。 | 在“Settings”&#xff08;选项&#xff0…

一文入门云上StarRocks | EMR Serverless StarRocks

一文入门云上StarRocks | EMR Serverless StarRocks 什么是EMR Serverless StarRocksEMR Serverless StarRocks 操作免费开通创建实例连接StarRocks实例临时查询新建连接元数据管理诊断与分析 写在最后 什么是EMR Serverless StarRocks 在使用一个云产品之前&#xff0c;我们首…

C语言 结构体和共用体——结构体类型与结构体变量

目录 问题的提出 数组的解决方法 我们希望的内存分配图 如何声明一个结构体类型&#xff1f; 如何定义一个结构体变量&#xff1f; 用typedef给数据类型定义一个别名 如何定义一个结构体变量&#xff1f; 结构体变量的初始化 问题的提出 数组的解决方法 我们希望的内存…

解决树形表格 第一列中文字没有对齐

二级分类与一级分类的文字没有对齐 <el-table:data"templateStore.hangyeList"style"width: 100%"row-key"id":tree-props"{ children: subData, hasChildren: hasChildren }" ><el-table-column prop"industryCode&quo…

【Unity2D 2022:Audio】添加游戏音乐和音效

一、添加背景音乐 1. 创建空的游戏物体&#xff0c;名为BackgroundMusic 2. 为音频播放器添加音频源&#xff08;Audio Source&#xff09;组件 3. 将背景音乐音频赋值到AudioClip&#xff08;红色&#xff09; 4. 设置循环播放&#xff08;蓝色&#xff09; 二、添加草莓拾取…

AI赋能,全面筑牢防线:重点非煤矿山重大灾害风险防控系统探析

一、背景需求 随着工业化和现代化的快速发展&#xff0c;非煤矿山作为重要的资源开采基地&#xff0c;其安全生产问题日益受到社会各界的广泛关注。非煤矿山在开采过程中&#xff0c;面临着诸多重大灾害风险&#xff0c;如滑坡、坍塌、水害、火灾等&#xff0c;这些灾害一旦发…

Start LoongArch64 Alpine Linux VM on x86_64

一、Build from source(build on x86_64) Obtain the latest libvirt, virt manager, and QEMU source code, compile and install them 1.1 Build libvirt from source sudo apt-get update sudo apt-get install augeas-tools bash-completion debhelper-compat dh-apparmo…

【音视频 | RTSP】SDP(会话描述协议)详解 及 抓包例子分析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

机器视觉理论入门

文章目录 前言一、马尔视觉理论二、图形与图像三、图像基础名词总结 前言 Marr的视觉计算理论立足于计算机科学&#xff0c;系统地概括了心理物理学、神经生理学、临床神经病理学等方面已取得的所有重要成果&#xff0c;是迄今为止最为系统的视觉理论。Marr 的视觉计算理论虽然…

Linux学习——Linux中无法使用ifconfg命令

Linux学习——Linux中无法使用ifconfg命令&#xff1f; &#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅…