机器学习 - 数据分布



在机器学习中,数据分布指的是数据点在一个数据集中分布或分散的方式。了解数据集中数据的分布非常重要,因为它会对机器学习算法的性能产生重大影响。

数据分布可以通过几个统计量来描述,包括均值、中位数、众数、标准差和方差。这些度量有助于描述数据的集中趋势、离散程度和形状。

下面列出了一些机器学习中常见的数据分布类型:

正态分布

正态分布,也称为高斯分布,是一种在机器学习和统计学中广泛使用的连续概率分布。它是一个钟形曲线,描述了一个随机变量的概率分布,该变量围绕均值对称。正态分布有两个参数,均值 (μ) 和标准差 (σ)。

在机器学习中,正态分布通常用于模拟线性回归和其他统计模型中误差项的分布。它也用作各种假设检验和置信区间的基础。

正态分布的一个重要特性是经验法则,也称为 68-95-99.7 法则。该法则指出,大约 68% 的观测值落在均值的一个标准差内,95% 的观测值落在均值的两个标准差内,99.7% 的观测值落在均值的三个标准差内。

Python 提供了各种库,可用于处理正态分布。其中一个库是 **scipy.stats**,它提供了用于计算正态分布的概率密度函数 (PDF)、累积分布函数 (CDF)、百分位函数 (PPF) 和随机变量的函数。

示例

以下是如何使用 **scipy.stats** 生成和可视化正态分布的示例:

import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt

# Generate a random sample of 1000 values from a normal distribution
mu = 0 # Mean
sigma = 1 # Standard deviation
sample = np.random.normal(mu, sigma, 1000)

# Calculate the PDF for the normal distribution
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
pdf = norm.pdf(x, mu, sigma)
# Plot the histogram of the random sample and the PDF of the normal
distribution
plt.figure(figsize=(7.5, 3.5))
plt.hist(sample, bins=30, density=True, alpha=0.5)
plt.plot(x, pdf)
plt.show()

在这个例子中,我们首先使用 **np.random.normal** 从均值为 0、标准差为 1 的正态分布中生成 1000 个随机值的样本。然后,我们使用 norm.pdf 计算正态分布的 PDF,并使用 **np.linspace** 生成一个包含 100 个从 μ -3σ 到 μ +3σ 的均匀间隔值的数组。

最后,我们使用 **plt.hist** 绘制随机样本的直方图,并使用 **plt.plot** 在上面叠加正态分布的 PDF。

输出

生成的图表显示了正态分布的钟形曲线以及近似于正态分布的随机样本的直方图。

bell shaped

偏态分布

在机器学习中,偏态分布指的是数据集在其均值或平均值周围分布不均匀。在偏态分布中,大多数数据点倾向于聚集在分布的一端,而另一端的数据点较少。

偏态分布有两种类型:左偏和右偏。左偏分布,也称为负偏分布,在分布的左侧有一个长尾,大多数数据点在右侧。相反,右偏分布,也称为正偏分布,在分布的右侧有一个长尾,大多数数据点在左侧。

偏态分布可能出现在许多不同类型的数据集中,例如财务数据、社交媒体指标或医疗记录。在机器学习中,识别并正确处理偏态分布非常重要,因为它们会影响某些算法和模型的性能。例如,在某些情况下,偏态数据会导致预测偏差和结果不准确,可能需要进行归一化或数据转换等预处理技术来提高模型的性能。

示例

以下是如何使用 Python 的 NumPy 和 Matplotlib 库生成和绘制偏态分布的示例:

import numpy as np
import matplotlib.pyplot as plt

# Generate a skewed distribution using NumPy's random function
data = np.random.gamma(2, 1, 1000)

# Plot a histogram of the data to visualize the distribution
plt.figure(figsize=(7.5, 3.5))
plt.hist(data, bins=30)

# Add labels and title to the plot
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Skewed Distribution')

# Show the plot
plt.show()

输出

执行此代码后,您将获得以下图表作为输出:

skewed distribution

均匀分布

在机器学习中,均匀分布指的是所有可能的结果都等可能发生的概率分布。换句话说,数据集中每个值都有相同的被观察到的概率,并且数据点没有围绕特定值聚集。

均匀分布通常用作与其他分布进行比较的基线,因为它表示数据的随机和无偏采样。它在某些类型的应用中也很有用,例如生成随机数或从集合中无偏地选择项目。

在概率论中,连续均匀分布的概率密度函数定义为:

$$f\left ( x \right )=\left\{\begin{matrix} 1 & for\: a\leq x\leq b \\ 0 & otherwise \\ \end{matrix}\right.$$

其中 a 和 b 分别是分布的最小值和最大值。均匀分布的均值为 $\frac{a+b}{2} $,方差为 $\frac{\left ( b-a \right )^{2}}{12}$

示例

在 Python 中,NumPy 库提供了用于从均匀分布生成随机数的函数,例如 **numpy.random.uniform()**。这些函数将分布的最小值和最大值作为参数,可用于生成具有均匀分布的数据集。

以下是如何使用 Python 的 NumPy 库生成均匀分布的示例:

import numpy as np
import matplotlib.pyplot as plt

# Generate 10,000 random numbers from a uniform distribution between 0 and 1
uniform_data = np.random.uniform(low=0, high=1, size=10000)

# Plot the histogram of the uniform data
plt.figure(figsize=(7.5, 3.5))
plt.hist(uniform_data, bins=50, density=True)

# Add labels and title to the plot
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Uniform Distribution')

# Show the plot
plt.show()

输出

它将生成以下图表作为输出:

uniform distribution

双峰分布

在机器学习中,双峰分布是一种具有两个不同众数或峰值的概率分布。换句话说,分布有两个数据值最有可能出现的位置,它们之间存在一个数据不太可能出现的谷或槽。

双峰分布可能出现在各种类型的数据中,例如生物识别测量、经济指标或社交媒体指标。它们可以表示数据集中不同的子群体,或随时间推移的不同行为模式或趋势。

可以使用各种统计方法识别和分析双峰分布,例如直方图、核密度估计或假设检验。在某些情况下,双峰分布可以拟合到特定的概率分布,例如高斯混合模型,该模型允许分别对底层子群体进行建模。

示例

在 Python 中,NumPy、SciPy 和 Matplotlib 等库提供了用于生成和可视化双峰分布的函数。

例如,以下代码生成并绘制了一个双峰分布:

import numpy as np
import matplotlib.pyplot as plt

# Generate 10,000 random numbers from a bimodal distribution
bimodal_data = np.concatenate((np.random.normal(loc=-2, scale=1, size=5000),
   np.random.normal(loc=2, scale=1, size=5000)))
 
# Plot the histogram of the bimodal data
plt.figure(figsize=(7.5, 3.5))
plt.hist(bimodal_data, bins=50, density=True)

# Add labels and title to the plot
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.title('Bimodal Distribution')

# Show the plot
plt.show()

输出

执行此代码后,您将获得以下图表作为输出:

bimodal_distribution
广告