编写一个函数,使用标准化和最小最大标准化对数据集执行特征缩放。
该函数应采用 2维 NumPy 数组作为输入,其中每行代表一个数据样本,每列代表一个特征。返回两个 2维 NumPy 数组 数组:一个通过标准化缩放,一个通过最小-最大标准化缩放。
输出结果均四舍五入保留小数点后后四位。
输入一个 2维 NumPy 数组
返回两个 2维 List 数组:一个通过标准化缩放,一个通过最小-最大标准化缩放。
[[7, 13], [22, 8], [15, 29]]
([[-1.251, -0.4094], [1.1966, -0.9676], [0.0544, 1.377]], [[0.0, 0.2381], [1.0, 0.0], [0.5333, 1.0]])
1.Python3对应的输入、输出已给出,您只用实现核心功能函数即可。
2.支持numpy、scipy、pandas、scikit-learn库。
import ast import math def mean(x): m = len(x[0]) total = [0. for _ in range(m)] for i in range(m): cnt = 0. for num in x: cnt += num[i] total[i] = cnt return [(nums/len(x)) for nums in total] def std(x): mu = mean(x) res = [0. for _ in range(len(x[0]))] k=0. for vec in x: for i in range(len(vec)): k = (vec[i] - mu[i]) ** 2 res[i] += k # res 存储了每个位置上的x-mu平方总和 return ([math.sqrt(s/len(x)) for s in res]) # 输入是一组数据,返回是标准化后的数据 def standardized(x): mu = mean(x) sigma = std(x) stand = 0. res = [[] for _ in range(len(x))] for idx, num in enumerate(x): for i in range(len(num)): stand = (num[i] - mu[i]) / sigma[i] res[idx].append(stand) return res def normalized(x): n = len(x[0]) find = [[] for _ in range(n)] ans_min = [] ans_max = [] res = [[] for _ in range(len(x))] for i in range(n): for num in x: find[i].append(num[i]) ans_min.append(min(find[i])) # ans_min存储每个位置i上的最小值 ans_max.append(max(find[i])) # ans_max存储每个位置i上的最大值 for idx, vec in enumerate(x): for i in range(len(ans_max)): res[idx].append((vec[i] - ans_min[i]) / (ans_max[i] - ans_min[i])) return res # res存储normalized后的结果 def main(): data = ast.literal_eval(input().strip()) n = len(data) ans = [[] for _ in range(2*n)] stand = standardized(data) norm = normalized(data) paired = list(zip(stand, norm)) # 打印结构化输出,便于阅读 formatted = [] for row in zip(*paired): row_fmt = [] for col in row: row_fmt.append([round(v,4) for v in col]) formatted.append(row_fmt) print(tuple(formatted)) # 主程序 if __name__ == "__main__": main()