首页 > 试题广场 >

特征扩展实现

[编程题]特征扩展实现
  • 热度指数:482 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
编写一个函数,使用标准化和最小最大标准化对数据集执行特征缩放。
该函数应采用 2维 NumPy 数组作为输入,其中每行代表一个数据样本,每列代表一个特征。返回两个 2维 NumPy 数组 数组:一个通过标准化缩放,一个通过最小-最大标准化缩放。
输出结果均四舍五入保留小数点后后四位。

输入描述:
输入一个 2维 NumPy 数组


输出描述:
返回两个 2维 List 数组:一个通过标准化缩放,一个通过最小-最大标准化缩放。
示例1

输入

[[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库。

不使用numpy的做法
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()

发表于 2025-09-18 17:04:50 回复(0)