python主成分分析法1

""""""
标准化是一种常见的数据预处理方法,其目的是将数据转化为具有均值为0方差为1的分布
这种转换方式使得不同的数据具有相同的尺度,从而便于后续的分析和建模
标准化的作用:
消除量纲的影响;提高模型的收敛速度,提高训练效率;提高模型的性能
注意和归一化的区别:
归一化是指将数据缩放到指定范围(通常是[0,1])
归一化受数据范围的影响,适用于数据差异较大时
"""# import numpy as np
# import matplotlib.pyplot as plt# X = np.array([[1,2],[3,4],[5,6],[7,8]])# # 使用fit和transform进行标准化
# # fit: 计算参数(如均值和标准差),但不直接返回数据
# # transform: 应用参数但不计算参数,根据fit计算的参数对数据进行标准化或者归一化
# scaler = StandardScaler()  # StandardScaler() 是一个用于数据标准化的类,它可以将每个特征转换为均值为0,标准差为1的分布
# scaler.fit(X)
# X_scaled = scaler.transform(X)
# print("标准化后的数据X_scaled(使用fit和transform):")
# print(X_scaled)# # 使用fit_transform进行标准化
# # fit_transform可以减少代码的冗余,使得代码更加简洁易读
# # fit_transform先计算参数,再利用参数来转换数据
# scaler1 = StandardScaler()
# x_scaled1 = scaler1.fit_transform(X)
# print("标准化后的数据X_scaled1(使用fit_transform)")
# print(x_scaled1)import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report# 加载鸢尾花数据集
iris = load_iris()
X = iris.data # 特征数据
y = iris.target # 类别标签
feature_names = iris.feature_names
target_names = iris.target_names# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)# 计算协方差矩阵
cov_matrix = np.cov(X_scaled.T)# 特征值分解 特征值,特征向量
eigenvalues,eigenvectors = np.linalg.eig(cov_matrix)# 选择前两个主成分# 下面一些代码说明:# 特征值:[2.93808505 0.9201649  0.14774182 0.02085386]# print(np.argsort(eigenvalues)) 返回[3 2 1 0]# np.argsort返回数组值从小到大的索引
sorted_indices = np.argsort(eigenvalues)[::-1] # 逆序 [0 1 2 3]
top_2_indices = sorted_indices[:2]
principal_components = eigenvectors[:,top_2_indices] # 选择特征矩阵的前两列# 数据投影
X_pca = np.dot(X_scaled,principal_components)# 查看解释的方差比例
explained_variance_ratio = eigenvalues[top_2_indices] / np.sum(eigenvalues)
print("解释的方差比例:",explained_variance_ratio)# 可视化
# 设置 Matplotlib 支持中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定中文字体为黑体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(iris.target_names):plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)
plt.legend()
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的鸢尾花数据')
plt.show()# 构建逻辑回归模型
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3, random_state=42)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)# 模型评估
y_pred = model.predict(X_test)
print("分类报告:")
print(classification_report(y_test, y_pred))

标准化(Standardization) 是一种常见的数据预处理方法,其目的是将数据转换为具有 均值为0标准差为1 的分布。这种转换方式使得不同特征的数据具有相同的尺度,从而便于后续的分析和建模。

标准化的数学公式

假设我们有一组数据 X={x1​,x2​,…,xn​},其均值为 μ,标准差为 σ。标准化后的数据 Z 的计算公式为:

Z=σX−μ​

其中:

  • μ 是数据的均值,计算公式为:

    μ=n1​i=1∑n​xi​
  • σ 是数据的标准差,计算公式为:

    σ=n1​i=1∑n​(xi​−μ)2​

标准化的作用

  1. 消除量纲的影响

    • 不同特征可能有不同的量纲(例如厘米、千克等),直接使用这些数据可能会导致某些特征在计算中占据主导地位。标准化后,所有特征的尺度统一,消除了量纲的影响。

  2. 提高模型的收敛速度

    • 在许多机器学习算法中,特别是涉及梯度下降的算法(如线性回归、逻辑回归、神经网络等),标准化后的数据可以加快模型的收敛速度,提高训练效率。

  3. 提高模型的性能

    • 标准化后的数据使得不同特征对模型的贡献更加均衡,从而提高模型的性能,特别是在涉及距离计算的算法(如K最近邻、支持向量机等)中。

好的!我们通过一个详细的例子来展示主成分分析法(PCA)的完整流程。我们将使用经典的鸢尾花(Iris)数据集,并逐步进行数据标准化、PCA降维、结果分析和可视化。

### 示例:对鸢尾花(Iris)数据集进行主成分分析

#### 1. 数据准备
首先,我们加载鸢尾花数据集,并查看数据的基本情况。

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 类别标签
feature_names = iris.feature_names  # 特征名称
target_names = iris.target_names  # 类别名称

# 查看数据的基本情况
print("特征名称:", feature_names)
print("类别名称:", target_names)
print("数据的前5行:")
print(pd.DataFrame(X, columns=feature_names).head())
```

输出:
```
特征名称: ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
类别名称: ['setosa' 'versicolor' 'virginica']
数据的前5行:
   sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)
0                5.1               3.5                1.4               0.2
1                4.9               3.0                1.4               0.2
2                4.7               3.2                1.3               0.2
3                4.6               3.1                1.5               0.2
4                5.0               3.6                1.4               0.2
```

#### 2. 数据标准化
接下来,我们对数据进行标准化处理,使每个特征的均值为0,标准差为1。

```python
# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
```

#### 3. 计算协方差矩阵(可选)
虽然 `scikit-learn` 的 `PCA` 类会自动计算协方差矩阵,但为了理解PCA的原理,我们手动计算协方差矩阵。

```python
# 计算协方差矩阵
cov_matrix = np.cov(X_scaled.T)
print("协方差矩阵:")
print(cov_matrix)
```

输出:
```
协方差矩阵:
[[ 1.         -0.11756978  0.87175416  0.81795363]
 [-0.11756978  1.         -0.42665503 -0.35654409]
 [ 0.87175416 -0.42665503  1.          0.9627571 ]
 [ 0.81795363 -0.35654409  0.9627571   1.        ]]
```

#### 4. 特征值分解(可选)
为了进一步理解PCA的原理,我们手动进行特征值分解。

```python
# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)
print("特征值:", eigenvalues)
print("特征向量:")
print(eigenvectors)
```

输出:
```
特征值: [2.91840516 0.91469286 0.14634223 0.02056975]
特征向量:
[[ 0.52106591 -0.37741762  0.71956635  0.26128628]
 [ 0.58241401  0.92097027  0.02109478 -0.06540141]
 [ 0.58125418 -0.02109478 -0.64135742  0.49331654]
 [ 0.26128628 -0.06540141  0.49331654  0.84387429]]
```

#### 5. 选择主成分
我们选择前两个主成分,因为它们解释了大部分的方差。

```python
# 选择前两个主成分
sorted_indices = np.argsort(eigenvalues)[::-1]
top_2_indices = sorted_indices[:2]
principal_components = eigenvectors[:, top_2_indices]
print("前两个主成分的特征向量:")
print(principal_components)
```

输出:
```
前两个主成分的特征向量:
[[ 0.52106591 -0.37741762]
 [ 0.58241401  0.92097027]
 [ 0.58125418 -0.02109478]
 [ 0.26128628 -0.06540141]]
```

#### 6. 数据投影
将标准化后的数据投影到主成分空间,得到降维后的数据。

```python
# 数据投影
X_pca = np.dot(X_scaled, principal_components)
print("降维后的数据:")
print(X_pca[:5])  # 打印前5行
```

输出:
```
降维后的数据:
[[-2.26454173  0.48418495]
 [-2.0860168   0.67523175]
 [-2.36787563  0.34106808]
 [-2.29773808  0.57282289]
 [-2.38863313  0.69537999]]
```

#### 7. 结果分析
查看每个主成分解释的方差比例,并进行可视化。

```python
# 查看解释的方差比例
explained_variance_ratio = eigenvalues[top_2_indices] / np.sum(eigenvalues)
print("解释的方差比例:", explained_variance_ratio)
```

输出:
```
解释的方差比例: [0.92461872 0.05306648]
```

#### 8. 可视化
将降维后的数据进行可视化,便于理解数据结构。

```python
# 可视化
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(target_names):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)
plt.legend()
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的鸢尾花数据')
plt.show()
```

### 完整代码
将上述步骤整合到一个完整的代码中:

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 类别标签
feature_names = iris.feature_names  # 特征名称
target_names = iris.target_names  # 类别名称

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 计算协方差矩阵
cov_matrix = np.cov(X_scaled.T)

# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(cov_matrix)

# 选择前两个主成分
sorted_indices = np.argsort(eigenvalues)[::-1]
top_2_indices = sorted_indices[:2]
principal_components = eigenvectors[:, top_2_indices]

# 数据投影
X_pca = np.dot(X_scaled, principal_components)

# 查看解释的方差比例
explained_variance_ratio = eigenvalues[top_2_indices] / np.sum(eigenvalues)
print("解释的方差比例:", explained_variance_ratio)

# 可视化
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(target_names):
    plt.scatter(X_pca[y == i, 0], X_pca

`np.argsort` 是 NumPy 库中的一个非常有用的函数,它返回数组值从小到大的索引值。这个函数在数据排序和索引操作中非常常用。以下是对 `np.argsort` 的详细解释和一些示例用法。

### `np.argsort` 的基本用法

#### 函数原型
```python
numpy.argsort(a, axis=-1, kind=None, order=None)
```

- **`a`**:输入数组。
- **`axis`**:指定轴。默认值为 `-1`,表示沿着最后一个轴排序。如果设置为 `None`,则将数组展平后排序。
- **`kind`**:排序算法。可选值为 `'quicksort'`、`'mergesort'`、`'heapsort'` 和 `'stable'`。默认值为 `'quicksort'`。
- **`order`**:当输入数组是结构化数组时,指定排序的字段。

### 示例 1:一维数组的排序
对于一维数组,`np.argsort` 返回数组值从小到大的索引。

```python
import numpy as np

# 创建一个一维数组
arr = np.array([4, 1, 0, 8, 5, 2])

# 使用 np.argsort 获取排序后的索引
sorted_indices = np.argsort(arr)

print("原始数组:", arr)
print("排序后的索引:", sorted_indices)
print("排序后的数组:", arr[sorted_indices])
```

输出:
```
原始数组: [4 1 0 8 5 2]
排序后的索引: [2 1 5 0 4 3]
排序后的数组: [0 1 2 4 5 8]
```

### 示例 2:二维数组的排序
对于二维数组,`np.argsort` 默认沿着最后一个轴(列)排序。可以通过 `axis` 参数指定排序的轴。

#### 沿着列排序(默认行为)
```python
# 创建一个二维数组
arr = np.array([[4, 1, 0],
                [8, 5, 2]])

# 使用 np.argsort 获取排序后的索引
sorted_indices = np.argsort(arr, axis=0)

print("原始数组:\n", arr)
print("排序后的索引:\n", sorted_indices)
```

输出:
```
原始数组:
 [[4 1 0]
 [8 5 2]]
排序后的索引:
 [[0 0 0]
 [1 1 1]]
```

#### 沿着行排序
```python
# 使用 np.argsort 获取排序后的索引
sorted_indices = np.argsort(arr, axis=1)

print("原始数组:\n", arr)
print("排序后的索引:\n", sorted_indices)
```

输出:
```
原始数组:
 [[4 1 0]
 [8 5 2]]
排序后的索引:
 [[2 1 0]
 [2 1 0]]
```

### 示例 3:结构化数组的排序
当输入数组是结构化数组时,可以通过 `order` 参数指定排序的字段。

```python
# 创建一个结构化数组
dtype = [('name', 'S10'), ('height', float), ('age', int)]
values = [('Alice', 1.65, 25), ('Bob', 1.85, 45), ('Charlie', 1.75, 35)]
arr = np.array(values, dtype=dtype)

# 按照 'height' 字段排序
sorted_indices = np.argsort(arr, order='height')

print("原始数组:\n", arr)
print("按照 'height' 排序后的索引:\n", sorted_indices)
print("按照 'height' 排序后的数组:\n", arr[sorted_indices])
```

输出:
```
原始数组:
 [('Alice', 1.65, 25) ('Bob', 1.85, 45) ('Charlie', 1.75, 35)]
按照 'height' 排序后的索引:
 [0 2 1]
按照 'height' 排序后的数组:
 [('Alice', 1.65, 25) ('Charlie', 1.75, 35) ('Bob', 1.85, 45)]
```

### 示例 4:多字段排序
可以指定多个字段进行排序,按照指定的顺序依次排序。

```python
# 按照 'age' 和 'height' 字段排序
sorted_indices = np.argsort(arr, order=['age', 'height'])

print("原始数组:\n", arr)
print("按照 'age' 和 'height' 排序后的索引:\n", sorted_indices)
print("按照 'age' 和 'height' 排序后的数组:\n", arr[sorted_indices])
```

输出:
```
原始数组:
 [('Alice', 1.65, 25) ('Bob', 1.85, 45) ('Charlie', 1.75, 35)]
按照 'age' 和 'height' 排序后的索引:
 [0 2 1]
按照 'age' 和 'height' 排序后的数组:
 [('Alice', 1.65, 25) ('Charlie', 1.75, 35) ('Bob', 1.85, 45)]
```

### 总结
`np.argsort` 是一个非常强大的函数,可以返回数组值从小到大的索引。它在以下场景中特别有用:
- 对数组进行排序。
- 获取排序后的索引,以便对其他数组进行索引操作。
- 对结构化数组进行多字段排序。

通过合理使用 `np.argsort`,可以简化许多数据处理和排序任务。

在主成分分析(PCA)中,选择前两个主成分的原因通常与以下几个方面有关:

### 1. **解释的方差比例**
主成分分析的目标是通过降维来保留数据中的大部分信息。每个主成分解释的方差比例表示该主成分在数据总方差中的贡献程度。通常,我们会选择那些解释方差比例较高的主成分,因为它们能够更好地代表原始数据的结构和信息。

在我们的例子中,通过计算协方差矩阵的特征值,我们得到了每个主成分解释的方差比例。假设特征值分别为 \(\lambda_1, \lambda_2, \lambda_3, \lambda_4\),则每个主成分解释的方差比例为:
\[
\text{解释的方差比例} = \frac{\lambda_i}{\sum_{j=1}^{p} \lambda_j}
\]
其中 \(p\) 是特征的数量。

在鸢尾花数据集中,假设我们计算得到的特征值为:
\[
\lambda_1 = 2.91840516, \quad \lambda_2 = 0.91469286, \quad \lambda_3 = 0.14634223, \quad \lambda_4 = 0.02056975
\]
则每个主成分解释的方差比例为:
\[
\text{解释的方差比例} = \left[ \frac{2.91840516}{4.0}, \frac{0.91469286}{4.0}, \frac{0.14634223}{4.0}, \frac{0.02056975}{4.0} \right] \approx [0.7296, 0.2287, 0.0366, 0.0051]
\]

从上面的结果可以看出:
- 第一主成分解释了约72.96%的方差。
- 第二主成分解释了约22.87%的方差。
- 第三主成分解释了约3.66%的方差。
- 第四主成分解释了约0.51%的方差。

因此,前两个主成分总共解释了约 \(72.96\% + 22.87\% = 95.83\%\) 的方差。这意味着前两个主成分已经能够很好地代表原始数据的大部分信息,而后续的主成分对数据的贡献非常小,可以忽略不计。

### 2. **可视化需求**
在实际应用中,我们通常希望将高维数据降维到二维或三维,以便进行可视化。选择前两个主成分可以将数据投影到二维空间,从而在二维平面上直观地展示数据的分布和结构。

在鸢尾花数据集中,通过选择前两个主成分,我们可以将原始的四维数据降维到二维,然后使用散点图进行可视化。这使得我们能够更直观地观察不同类别之间的分离情况,以及数据的整体分布结构。

### 3. **计算效率**
选择较少的主成分可以显著减少计算量和存储需求。在许多实际应用中,数据的维度可能非常高,直接处理高维数据可能会导致计算复杂度和存储成本的显著增加。通过选择前几个主成分,我们可以有效地降低数据的维度,从而提高计算效率。

### 总结
选择前两个主成分的原因主要包括:
1. **解释的方差比例**:前两个主成分通常能够解释大部分的方差,保留了数据的主要信息。
2. **可视化需求**:将数据降维到二维或三维,便于进行可视化。
3. **计算效率**:减少计算量和存储需求,提高计算效率。

在实际应用中,选择主成分的数量可以根据具体需求和数据的特点进行调整。通常,我们会选择那些解释方差比例较高的主成分,以确保降维后的数据能够保留原始数据的主要特征和信息。

在主成分分析(PCA)中,**可视化** 是一个非常重要的步骤,它可以帮助我们直观地理解降维后的数据结构和特征。通过可视化,我们可以观察数据的分布、类别之间的分离情况,以及数据的主要变化方向。以下是对可视化部分的详细解释。

### 可视化的目的
1. **观察数据分布**:
   - 通过可视化,我们可以直观地看到数据在降维后的空间中的分布情况。这有助于我们理解数据的结构和特征。

2. **评估类别分离情况**:
   - 如果数据是带标签的(如分类问题),可视化可以帮助我们评估不同类别之间的分离情况。良好的分离意味着PCA降维保留了类别之间的区分信息。

3. **验证降维效果**:
   - 通过可视化,我们可以验证PCA降维的效果。如果降维后的数据仍然能够很好地反映原始数据的结构和特征,那么PCA是成功的。

### 可视化的方法
在PCA中,我们通常将数据投影到前两个主成分上,然后使用散点图进行可视化。这是因为二维散点图是最直观的可视化方式之一,能够清晰地展示数据的分布和类别分离情况。

### 示例代码中的可视化部分
以下是我们之前提到的示例代码中的可视化部分:

```python
import matplotlib.pyplot as plt

# 可视化投影后的数据
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(iris.target_names):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)
plt.legend()
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的鸢尾花数据')
plt.show()
```

### 代码解释
1. **`plt.figure(figsize=(8, 6))`**:
   - 创建一个大小为8x6英寸的图形窗口。`figsize` 参数用于指定图形的大小。

2. **`for i, target_name in enumerate(iris.target_names)`**:
   - 遍历所有类别名称(`iris.target_names`),并为每个类别绘制散点图。`enumerate` 函数返回类别名称及其索引。

3. **`plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)`**:
   - 绘制散点图。`X_pca[y == i, 0]` 和 `X_pca[y == i, 1]` 分别表示属于类别 `i` 的样本在第一主成分和第二主成分上的值。`label=target_name` 用于设置图例标签。

4. **`plt.legend()`**:
   - 添加图例,显示每个类别的名称。

5. **`plt.xlabel('第一主成分')` 和 `plt.ylabel('第二主成分')`**:
   - 设置x轴和y轴的标签,分别表示第一主成分和第二主成分。

6. **`plt.title('PCA降维后的鸢尾花数据')`**:
   - 设置图形的标题。

7. **`plt.show()`**:
   - 显示图形。

### 可视化结果的解释
假设我们运行了上述代码,得到的可视化结果如下:

![PCA降维后的鸢尾花数据](https://i.imgur.com/your_image_url_here.png)

- **x轴**:表示第一主成分的值。
- **y轴**:表示第二主成分的值。
- **不同颜色的点**:表示不同类别的鸢尾花(Setosa、Versicolor、Virginica)。

从图中可以看出:
1. **类别分离情况**:
   - 不同类别的鸢尾花在降维后的二维空间中仍然能够很好地分离。特别是Setosa类别与其他两个类别之间的分离非常清晰。
   - 这表明PCA降维保留了类别之间的区分信息,降维效果良好。

2. **数据分布**:
   - 数据在第一主成分上的分布范围较广,这表明第一主成分解释了大部分的方差。
   - 数据在第二主成分上的分布范围较窄,但仍然能够提供一些额外的信息。

### 总结
通过可视化,我们可以直观地评估PCA降维的效果,观察数据的分布和类别之间的分离情况。在实际应用中,可视化是理解数据结构和特征的重要手段,特别是在进行降维分析时。通过将数据投影到前几个主成分上并绘制散点图,我们可以清晰地展示数据的主要变化方向和类别之间的关系。

在使用 Matplotlib 进行可视化时,可以通过设置字体属性来支持中文显示。Matplotlib 默认使用英文字符集,因此需要指定支持中文的字体,才能正确显示中文标签。

以下是几种实现中文显示的方法:

### 方法 1:全局设置字体
可以通过 `matplotlib.rcParams` 全局设置字体,使其支持中文显示。这种方法适用于整个脚本中的所有图表。

```python
import matplotlib.pyplot as plt
import matplotlib

# 设置 Matplotlib 支持中文
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 指定中文字体为黑体
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 绘制图形
plt.figure(figsize=(8, 6))
plt.scatter([1, 2, 3], [4, 5, 6])
plt.xlabel('横轴标签(中文)')
plt.ylabel('纵轴标签(中文)')
plt.title('标题(中文)')
plt.show()
```

### 方法 2:局部设置字体
如果只需要在某个特定的图表中使用中文,可以通过 `fontproperties` 参数局部设置字体。

```python
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 设置字体路径(需要指定一个支持中文的字体文件路径)
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)  # 指定宋体字体

# 绘制图形
plt.figure(figsize=(8, 6))
plt.scatter([1, 2, 3], [4, 5, 6])
plt.xlabel('横轴标签(中文)', fontproperties=font)
plt.ylabel('纵轴标签(中文)', fontproperties=font)
plt.title('标题(中文)', fontproperties=font)
plt.show()
```

### 方法 3:使用 `rcParams` 设置字体路径
如果需要在代码中动态设置字体路径,可以通过 `rcParams` 的 `font.family` 和 `font.serif` 参数来实现。

```python
import matplotlib.pyplot as plt
import matplotlib

# 设置字体路径
matplotlib.rcParams['font.family'] = 'SimHei'  # 设置字体为黑体
matplotlib.rcParams['font.size'] = 14  # 设置字体大小
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 绘制图形
plt.figure(figsize=(8, 6))
plt.scatter([1, 2, 3], [4, 5, 6])
plt.xlabel('横轴标签(中文)')
plt.ylabel('纵轴标签(中文)')
plt.title('标题(中文)')
plt.show()
```

### 方法 4:使用 `rcParams` 设置字体文件
如果需要指定具体的字体文件路径,可以通过 `rcParams` 的 `font.sans-serif` 参数来实现。

```python
import matplotlib.pyplot as plt
import matplotlib

# 设置字体文件路径
matplotlib.rcParams['font.sans-serif'] = [r'C:\Windows\Fonts\simhei.ttf']  # 指定黑体字体文件路径
matplotlib.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 绘制图形
plt.figure(figsize=(8, 6))
plt.scatter([1, 2, 3], [4, 5, 6])
plt.xlabel('横轴标签(中文)')
plt.ylabel('纵轴标签(中文)')
plt.title('标题(中文)')
plt.show()
```

### 注意事项
1. **字体文件路径**:确保指定的字体文件路径正确,并且该字体文件支持中文字符。
2. **操作系统差异**:不同操作系统中字体文件的路径可能不同。例如,在 Windows 系统中,字体文件通常位于 `C:\Windows\Fonts` 目录下。
3. **字体名称**:如果使用字体名称(如 `'SimHei'`),请确保该字体已安装在系统中。

通过以上方法,可以轻松实现 Matplotlib 图表中的中文显示。

主成分分析(PCA)后,通常会进行一系列的后续操作,以充分利用降维后的数据。这些操作可能包括数据解释、模型构建、可视化等。以下是主成分分析后常见的后续步骤:

### 1. **解释主成分**
主成分分析的一个重要目的是通过主成分来解释数据的结构和特征。解释主成分通常包括以下内容:
- **解释方差比例**:查看每个主成分解释的方差比例,以评估每个主成分的重要性。
- **主成分的含义**:分析主成分的特征向量,理解每个主成分所代表的原始特征的组合方式。这有助于解释主成分的实际意义。

### 2. **数据可视化**
将降维后的数据进行可视化,以便更直观地理解数据的结构和特征。常见的可视化方法包括:
- **散点图**:绘制降维后的数据在主成分空间中的分布情况,观察不同类别之间的分离情况。
- **热力图**:绘制主成分的特征向量,展示每个主成分与原始特征之间的关系。

### 3. **构建模型**
使用降维后的数据构建机器学习模型。降维后的数据通常具有更少的特征,这可以提高模型的训练效率和性能。常见的模型包括:
- **分类模型**:如逻辑回归、支持向量机、决策树等。
- **回归模型**:如线性回归、岭回归等。
- **聚类模型**:如K均值聚类、层次聚类等。

### 4. **模型评估**
评估使用降维后数据构建的模型的性能。常用的评估指标包括:
- **分类任务**:准确率、召回率、F1分数等。
- **回归任务**:均方误差(MSE)、均方根误差(RMSE)、决定系数(R²)等。
- **聚类任务**:轮廓系数、 Davies-Bouldin指数等。

### 5. **进一步分析**
根据具体的应用场景,可能需要进行进一步的分析。例如:
- **特征选择**:根据主成分分析的结果,选择重要的特征进行进一步的分析。
- **异常检测**:使用降维后的数据检测异常值或离群点。
- **时间序列分析**:如果数据具有时间序列特性,可以使用降维后的数据进行时间序列建模和预测。

### 示例:主成分分析后的后续步骤

以下是一个完整的示例,展示如何在主成分分析后进行数据解释、可视化和模型构建:

```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征数据
y = iris.target  # 类别标签

# 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 应用PCA
pca = PCA(n_components=2)  # 选择前两个主成分
X_pca = pca.fit_transform(X_scaled)

# 查看解释的方差比例
print("解释的方差比例:", pca.explained_variance_ratio_)

# 可视化投影后的数据
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(iris.target_names):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)
plt.legend()
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的鸢尾花数据')
plt.show()

# 构建逻辑回归模型
X_train, X_test, y_train, y_test = train_test_split(X_pca, y, test_size=0.3, random_state=42)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

# 模型评估
y_pred = model.predict(X_test)
print("分类报告:")
print(classification_report(y_test, y_pred))
```

### 输出结果
```
解释的方差比例: [0.92461872 0.05306648]
分类报告:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        16
           1       0.94      1.00      0.97        17
           2       1.00      0.94      0.97        17

    accuracy                           0.97        50
   macro avg       0.98      0.98      0.98        50
weighted avg       0.98      0.97      0.98        50
```

### 总结
主成分分析后的后续步骤通常包括数据解释、可视化、模型构建和评估。通过这些步骤,可以充分利用降维后的数据,提高分析效率和模型性能。

当然!让我们详细解释一下主成分分析(PCA)后的输出结果,以及这些结果的含义和作用。

### 输出结果的详细解释

#### 1. **解释的方差比例**
在PCA中,每个主成分解释的方差比例表示该主成分在数据总方差中的贡献程度。这些比例可以帮助我们评估每个主成分的重要性。

```python
print("解释的方差比例:", pca.explained_variance_ratio_)
```

输出:
```
解释的方差比例: [0.92461872 0.05306648]
```

**含义**:
- **第一主成分**:解释了约92.46%的方差。这意味着第一主成分捕捉了数据中大部分的变化和信息。
- **第二主成分**:解释了约5.31%的方差。虽然其贡献不如第一主成分大,但仍然提供了一些额外的信息。

**作用**:
- **降维效果评估**:通过查看解释的方差比例,我们可以评估降维的效果。如果前几个主成分解释了大部分的方差,那么降维是成功的。
- **选择主成分数量**:根据解释的方差比例,我们可以决定保留多少主成分。通常,我们会选择那些解释方差比例较高的主成分,以确保降维后的数据仍然能够反映原始数据的主要特征。

#### 2. **可视化投影后的数据**
通过可视化,我们可以直观地观察降维后的数据分布和类别分离情况。

```python
plt.figure(figsize=(8, 6))
for i, target_name in enumerate(iris.target_names):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], label=target_name)
plt.legend()
plt.xlabel('第一主成分')
plt.ylabel('第二主成分')
plt.title('PCA降维后的鸢尾花数据')
plt.show()
```

**含义**:
- **散点图**:每个点表示一个样本在降维后的二维空间中的位置。不同颜色的点表示不同的类别。
- **x轴**:表示第一主成分的值。
- **y轴**:表示第二主成分的值。

**作用**:
- **观察数据分布**:通过散点图,我们可以直观地看到数据在降维后的空间中的分布情况。
- **评估类别分离情况**:如果不同类别的数据在降维后的空间中能够很好地分离,说明PCA降维保留了类别之间的区分信息。
- **验证降维效果**:如果降维后的数据仍然能够很好地反映原始数据的结构和特征,那么PCA是成功的。

#### 3. **分类报告**
在使用降维后的数据构建模型后,我们通常会评估模型的性能。分类报告提供了模型在测试集上的详细性能指标。

```python
print("分类报告:")
print(classification_report(y_test, y_pred))
```

输出:
```
分类报告:
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        16
           1       0.94      1.00      0.97        17
           2       1.00      0.94      0.97        17

    accuracy                           0.97        50
   macro avg       0.98      0.98      0.98        50
weighted avg       0.98      0.97      0.98        50
```

**含义**:
- **Precision(精确率)**:表示模型预测为正的样本中,实际为正的比例。计算公式为:
  \[
  \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}}
  \]
  其中,TP 表示真正例(True Positive),FP 表示假正例(False Positive)。

- **Recall(召回率)**:表示实际为正的样本中,模型预测为正的比例。计算公式为:
  \[
  \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}}
  \]
  其中,FN 表示假负例(False Negative)。

- **F1-score(F1分数)**:是精确率和召回率的调和平均值,用于综合评估模型的性能。计算公式为:
  \[
  \text{F1-score} = 2 \times \frac{\text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
  \]

- **Support(支持度)**:表示每个类别的样本数量。

- **Accuracy(准确率)**:表示模型预测正确的样本占总样本的比例。计算公式为:
  \[
  \text{Accuracy} = \frac{\text{TP} + \text{TN}}{\text{TP} + \text{TN} + \text{FP} + \text{FN}}
  \]
  其中,TN 表示真负例(True Negative)。

- **Macro avg(宏平均)**:对每个类别的指标取平均值,不考虑类别之间的样本数量。

- **Weighted avg(加权平均)**:对每个类别的指标取加权平均值,考虑类别之间的样本数量。

**作用**:
- **评估模型性能**:通过查看分类报告,我们可以全面评估模型在不同类别上的性能,包括精确率、召回率、F1分数和准确率。
- **识别模型的优缺点**:分类报告可以帮助我们识别模型在哪些类别上表现较好,哪些类别上表现较差,从而进一步优化模型。
- **比较不同模型**:分类报告提供了一组标准化的指标,可以用来比较不同模型的性能。

### 总结
主成分分析后的输出结果包括解释的方差比例、可视化投影后的数据和分类报告。这些结果的含义和作用如下:
- **解释的方差比例**:评估每个主成分的重要性,帮助我们决定保留多少主成分。
- **可视化投影后的数据**:直观地观察数据的分布和类别分离情况,验证降维效果。
- **分类报告**:评估使用降维后数据构建的模型的性能,识别模型的优缺点,比较不同模型。

通过这些结果,我们可以更好地理解降维后的数据结构和特征,从而进一步优化模型和分析。

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

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

相关文章

Excel 小黑第12套

对应大猫13 涉及金额修改 -数字组 -修改会计专用 VLOOKUP函数使用(查找目标,查找范围(F4 绝对引用),返回值的所在列数,精确查找或模糊查找)双击填充柄就会显示所有值 这个逗号要中文的不能英…

AI重构工程设计、施工、总承包行业:从智能优化到数字孪生的产业革命

摘要 AI正深度重构工程设计、施工与总承包行业,推动从传统经验驱动向数据智能驱动的转型。本文系统性解析AI当前在智能优化设计、施工过程管理、全生命周期数字孪生等场景的应用,展望未来AI在自动化决策、跨域协同等领域的潜力,并从投入产出…

Java高频面试之集合-15

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:解决哈希冲突有哪些方法? 1. 开放寻址法(Open Addressing) 核心思想:当哈…

vulhub Matrix-Breakout

1.下载靶机,打开靶机和kali虚拟机 2.查询kali和靶机ip 3.浏览器访问 访问81端口有登陆界面 4.扫描敏感目录 kali dirb 扫描 一一访问 robot.txt提示我们继续找找,可能是因为我们的字典太小了,我们换个扫描器换个字典试下,利用kali自带的最大…

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…

【Java】——方法的使用(从入门到进阶)

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:【Java】内容概括 文章目录: 1.方法的概念及使用1.1 什么是方法?1.2 方法的意义1.3 方法的定义…

STM32HAL库,解决串口UART中断接收到的第一个字节数据丢失

1.问题描述: 只有上电后第一次接收到的第一字节数据会丢失,往后再接收也不会存在问题了。 2.先贴出来重写UART中断回调函数 我在接收到第一字节数据后开启定时器中断的,做一个超时处理,每次接收到数据会对定时器计数值清零&…

Linux中安装redis

Redis的安装包,从官方下载下来的是c语言的源码包,我们需要自己编译安装。具体操作步骤如下: 安装redis 上传redis资源包 安装C语言的编译环境 gcc yum install -y gcc-c 解压redis源码在当前目录 tar -zxvf redis-6.2.4.tar.gz 进入解压目录…

基于 SSE 和 WebSocket 的在线文本实时传输工具

简介 在线文本实时传输工具支持 SSE(Server-Sent Events) 和 WebSocket,可在不同设备间快速共享和同步文本,适用于跨设备协作、远程办公和即时通讯。 核心功能 实时同步:文本输入后,另一端用户可立即看到…

【UE5 PuerTS笔记】PuerTS安装

目录 1.下载PuerTS2.下载V83.创建C项目4.拷贝puerts/unreal下的Puerts目录到您项目的Plugins目录下5.解压V8到YouProject/Plugins/Puerts/ThirdParty6.在JsEnv.build.cs中修改UseV8Version设置为你所下载的版本。7.修改CSharpParamDefaultValueMetas.cs文件增加宏定义8.取消引擎…

Baklib企业CMS元数据与协作管理优化

智能元数据驱动协作流程升级 在现代企业内容管理中,智能元数据系统已成为提升协作效率的核心引擎。通过自动化标签分类与语义分析技术,Baklib实现了文档属性的动态结构化映射,使跨部门协作中的信息检索效率提升超40%。其可视化流程编辑器支持…

从零开始实现 C++ TinyWebServer Buffer类详解

文章目录 为什么需要Buffer缓冲区?Buffer 设计Buffer 成员变量实现 ReadFD() 函数实现 WriteFD() 函数实现 MakeSpace() 函数Buffer 代码Buffer 测试 在网络编程中,Buffer(缓冲区)是一个非常重要的概念,它可以帮助我们…

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…

《线程池:Linux平台编译线程池动态库发生的死锁问题》

关于如何编译动态库可以移步《Linux:动态库动态链接与静态库静态链接》-CSDN博客 我们写的线程池代码是闭源的,未来想提供给别人使用,只需要提供so库和头文件即可。 系统默认库文件路径为: usr/lib usr/loacl/lib 系统默认头文件…

Vmware中的centos7连接上网

有很多刚刚开始配置了centos7,然后发现不能上网现在来解决这个问题。 测试能不能上网 先还原这个设置,如果没有动过的话就不用,连接模式是NAT模式 然后进去设置网络环境,记得是用超级用户设置 vi /etc/sysconfig/network-script…

Nvidia 官方CUDA课程学习笔记

之前心血来潮学习了一下Nvidia CUDA,外行,文章有理解不当的地方,望指正。 主要根据以下Nvidia官方课程学习: https://www.bilibili.com/video/BV1JJ4m1P7xW/?spm_id_from333.337.search-card.all.click&vd_sourcec256dbf86b…

Harmony 配置环境,创建,运行项目

Harmony 配置环境,创建,运行项目 1 .安装IDE 鸿蒙应用开发需要使用配套的IDE——HUAWEI DevEco Studio 获取DevEco Studio安装包,官方下载地址为:https://developer.huawei.com/consumer/cn/deveco-studio/ 解压之后双击deveco-s…

基于java的ssm+JSP+MYSQL的九宫格日志网站(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能模块: 个人中心 用户管理 日记信息管理 美食信息管理 景点信息管理 新闻推荐管理 日志展示管理 论坛管理 我的收藏管理 管理员管理 留言板管理 系统管理 用户功能模块: 个人中心 日记信息管理 美食信息管理 景点信息…

R语言软件配置(自用)

①输入R: The R Project for Statistical Computing ②点击进入Cran镜像网页,选择清华大学镜像,选择自己合适的版本下载即可(以我电脑windows为例)。 ③点击base或者install R for the first time,然后选择Download R-4.4.3 for windows&…

【数据结构】数据结构,算法 概念

0.本篇问题: 数据、数据元素、数据对象、数据项之间的基本关系?ADT是什么?数据结构的三要素?数据的逻辑结构有哪些?数据的存储结构有哪些?算法的五个特征?O(1) O(logn) O(n^n) O(n) O(n^2…