一、项目简介
在数据分析、机器学习、数据预处理场景中,均值、标准差、中位数、数据标准化是最基础且核心的操作。数据标准化可以消除量纲影响,让不同维度数据具备可比性,是算法建模前置必备步骤。
本文使用纯C语言实现全套基础数据统计功能,无第三方库依赖,代码简洁易懂、可直接编译运行,适合初学者学习、课程作业、数据结构基础实训、CSDN发文复盘。
本次实现功能清单:
计算数据集均值(平均值)
计算总体标准差(数据离散程度)
计算数据集中位数
Z-score标准化(均值为0,标准差为1)
二、核心算法原理
1、均值(Mean)
均值是所有数据的平均值,反映数据集中趋势。
公式:所有数据求和 ÷ 数据个数
2、标准差(Standard Deviation)
标准差用于衡量数据的离散程度,数值越小,数据越集中;数值越大,数据越分散。本文实现总体标准差。
3、中位数(Median)
将数据从小到大排序后,处于中间位置的数值。中位数不受极端异常值影响,比均值更能反映数据真实水平。
数据个数为奇数:取中间单个数值
数据个数为偶数:取中间两个数值的平均值
4、Z-score标准化
最常用的数据标准化方法,将原始数据转换为均值为0、标准差为1的标准数据,消除单位和量纲差异。
公式:标准化值 = (原始值 - 数据集均值) / 数据集标准差
三、完整可运行源码
#include <stdio.h> #include <stdlib.h> #include <math.h> /** * @brief 计算数据集均值 * @param data 原始数据数组 * @param n 数据个数 * @return 均值结果 */ double mean(double *data, int n) { double sum = 0; for (int i = 0; i < n; i++) { sum += data[i]; } return sum / n; } /** * @brief 计算总体标准差 * @param data 原始数据数组 * @param n 数据个数 * @return 标准差结果 */ double std_dev(double *data, int n) { double m = mean(data, n); double sum_sq = 0; // 计算离均差平方和 for (int i = 0; i < n; i++) { sum_sq += (data[i] - m) * (data[i] - m); } // 总体标准差:除以n return sqrt(sum_sq / n); } /** * @brief Z-score标准化数据 * @param data 原始数据 * @param n 数据个数 * @param result 输出标准化结果数组 */ void normalize(double *data, int n, double *result) { double m = mean(data, n); double s = std_dev(data, n); // 逐一对数据标准化 for (int i = 0; i < n; i++) { result[i] = (data[i] - m) / s; } } /** * @brief 计算数据集中位数 * @param data 原始数据数组 * @param n 数据个数 * @return 中位数结果 */ double median(double *data, int n) { // 动态开辟内存,拷贝数据(不修改原数据) double *sorted = (double*)malloc(n * sizeof(double)); for (int i = 0; i < n; i++) { sorted[i] = data[i]; } // 冒泡排序,对数据升序排序 for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - 1 - i; j++) { if (sorted[j] > sorted[j + 1]) { double temp = sorted[j]; sorted[j] = sorted[j + 1]; sorted[j + 1] = temp; } } } double result; // 奇偶个数判断,计算中位数 if (n % 2 == 0) { result = (sorted[n/2 - 1] + sorted[n/2]) / 2; } else { result = sorted[n/2]; } // 释放动态内存,避免内存泄漏 free(sorted); return result; } int main() { // 测试数据集 double data[] = {25, 30, 35, 40, 28, 32, 45, 50, 55, 60}; int n = 10; printf("=== 基础统计指标计算 ===\n"); printf("均值: %.4f\n", mean(data, n)); printf("标准差: %.4f\n", std_dev(data, n)); printf("中位数: %.4f\n", median(data, n)); // 数据标准化处理 double normalized[10]; normalize(data, n, normalized); printf("\n=== Z-score标准化后数据 ===\n"); for (int i = 0; i < n; i++) { printf("%.4f ", normalized[i]); } printf("\n"); return 0; }四、代码逐模块解析
1、均值计算函数
遍历数组累加所有数据,最后除以数据总个数,精准计算数据集平均值,是最基础的统计指标。
2、标准差计算函数
先计算数据集均值,再遍历计算每个数据与均值的差值平方和,求平均值后开平方,得到总体标准差,精准反映数据波动情况。
3、数据标准化函数
基于均值和标准差,通过Z-score公式对每一个原始数据进行转换,最终得到标准化数据集,解决多维度数据量纲不统一的问题。
4、中位数计算函数
为了不破坏原始数据,动态拷贝一份数据,通过冒泡排序完成升序排列,再根据数据个数奇偶性,区分计算中位数,最后释放动态内存,杜绝内存泄漏。
五、编译与运行结果
编译命令
代码依赖数学函数库,编译时需要加-lm参数:
gcc stats.c -o stats -lm ./stats运行输出结果:
=== 基础统计指标计算 === 均值: 40.0000 标准差: 10.7703 中位数: 37.5000 === Z-score标准化后数据 === -1.3927 -0.9285 -0.4642 0.0000 -1.1142 -0.7428 0.4642 0.9285 1.3927 1.8570六、核心知识点总结
均值:反映数据整体平均水平,易受极端值影响
标准差:衡量数据离散、波动程度,数值越小数据越稳定
中位数:抗干扰能力强,适合存在异常值的数据集统计
Z-score标准化:数据分析预处理核心操作,统一数据尺度,广泛用于回归、聚类、机器学习算法
代码规范:动态开辟的内存必须手动free释放,避免内存泄漏
七、拓展优化方向
适配动态输入数据,支持自定义数据集,无需修改源码
新增样本标准差计算(除以n-1),适配抽样统计场景
新增最大值、最小值、极差、方差统计功能
优化排序算法,替换冒泡排序为快速排序,提升大数据量计算效率
新增最大最小值归一化(Min-Max标准化),丰富预处理方式