本项目包含两种数据归一化方法的实现示例,用于演示如何对CSV数据进行Min-Max归一化处理。
docker build -t cat-normalization .
docker run --rm -v $(pwd):/app cat-normalization python normalize.py
| No | Lwsk | LEar | Weight |
|---|---|---|---|
| 1 | 34.0 | 82 | 3520 |
| 2 | NaN | 63 | 4490 |
| 3 | 45.0 | 90 | 2480 |
| 4 | 28.0 | 91 | 4030 |
| 5 | 37.0 | 59 | 8000 |
| 6 | 39.0 | 52 | 6130 |
| 7 | 48.0 | 52 | 5310 |
| 8 | 47.0 | 49 | 5280 |
其中第2行(No=2)的Lwsk列包含空值NaN,用于测试空值处理功能。
归一化后的数据值范围将被映射到[0, 1]区间。
def MaxMinNormalization(x):
"""
手动实现Min-Max归一化
公式:(x - min) / (max - min)
"""
shapeX = x.shape
rows = shapeX[0] # 行数
cols = shapeX[1] # 列数
headers = list(x) # Header行
result = pd.DataFrame(columns=headers) # 存放结果的空DataFrame
for i in range(0, rows, 1):
dict1 = {} # 存放每一行结果的字典
dict1[headers[0]] = i
for j in range(1, cols, 1):
maxCol = x[headers[j]].max() # j列最大值
minCol = x[headers[j]].min() # j列最小值
val = (x.iloc[i, j] - minCol) / (maxCol - minCol) # i行j列数据的归一化结果
dict1[headers[j]] = val
result = pd.concat([result, pd.DataFrame([dict1])], ignore_index=True) # 把i行结果添加到result
return result
特点:
输出示例:
No Lwsk LEar Weight 0 0 0.30 0.785714 0.188406 1 1 NaN 0.333333 0.364130 2 2 0.85 0.976190 0.000000 3 3 0.00 1.000000 0.280797 4 4 0.45 0.238095 1.000000 5 5 0.55 0.071429 0.661232 6 6 1.00 0.071429 0.512681 7 7 0.95 0.000000 0.507246
from sklearn import preprocessing
data1 = pd.read_csv('CatInfo.csv')
x = data1.dropna(axis=0) # 去除含有空值的行
min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
print(x_minmax)
特点:
输出示例:
[[0. 0.3 0.78571429 0.1884058 ] [0.28571429 0.85 0.97619048 0. ] [0.42857143 0. 1. 0.2807971 ] [0.57142857 0.45 0.23809524 1. ] [0.71428571 0.55 0.07142857 0.66123188] [0.85714286 1. 0.07142857 0.51268116] [1. 0.95 0. 0.50724638]]
公式:
X_normalized = (X - X_min) / (X_max - X_min)
其中:
作用:
python normalize.py
import pandas as pd
data1 = pd.read_csv('input.csv')
newData = MaxMinNormalization(data1)
print('归一化后数据:\n', newData)
import pandas as pd
from sklearn import preprocessing
data1 = pd.read_csv('input.csv')
x = data1.dropna(axis=0) # 去除含有空值的行
min_max_scaler = preprocessing.MinMaxScaler()
x_minmax = min_max_scaler.fit_transform(x)
print(x_minmax)
| 特性 | 手动实现 | sklearn实现 |
|---|---|---|
| 空值处理 | 保留空值 | 自动去除空值行 |
| 输出格式 | DataFrame | numpy数组 |
| 代码复杂度 | 较高 | 简洁 |
| 适用场景 | 学习理解原理 | 生产环境 |
| 第一列处理 | 替换为索引 | 归一化处理 |
| 性能 | 较慢(循环) | 快(向量化) |
normalize.py - 归一化脚本主文件input.csv - 输入数据文件output.csv - 输出结果文件(如果保存)Dockerfile - Docker环境配置README.md - 项目说明文档