You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python计算相关系数始终返回0的问题求助

相关系数计算始终返回0的问题修复

问题背景

开发分析CSV格式社交媒体数据的Python程序,需计算用户量最高平台的用户年龄与收入的相关系数(多平台用户量相同时按字母排序取第一个),但无论输入数据如何,结果始终返回0。限制条件:不能导入额外库,不能调用print函数。

相关代码片段:

def platform_with_highest_users(data):
    # If data is empty
    if not data:
        return "Error: Empty data"
    
    # Initialize an empty dictionary to store platform counts
    platform_counts = {}
    
    # Count users for each platform
    for row in data:
        platform = row[4]
        platform_counts[platform] = platform_counts.get(platform, 0) + 1
    
    # Find the platform with the highest number of users
    highest_users = max(platform_counts.values())
    highest_platforms = [platform for platform, count in platform_counts.items() if count == highest_users]
    
    # If there's only one platform with the highest number of users, directly return its filtered data
    if len(highest_platforms) == 1:
        chosen_platform = highest_platforms[0]
    else:
        # Sort the highest platforms alphabetically and pick the first one
        chosen_platform = sorted(highest_platforms)[0]
    
    # Filter the data for the chosen platform
    filtered_data = [row for row in data if row[4] == chosen_platform]
    
    # Return filtered data for the chosen platform
    return filtered_data

    
def correlation_coefficient(filtered_data):
    if not filtered_data:
        return 0  

    x = [int(row[1]) for row in filtered_data]
    y = [int(row[9]) for row in filtered_data]

    # Calculate the correlation value following the given formula
    avg_x = (sum(x) / len(x))
    avg_y = (sum(y) / len(y))

    numerator = sum((x[i] - avg_x) * (y[i] - avg_y) for i in range(len(filtered_data)))
    denominator_x = (sum((x[i] - avg_x)) ** 2 for i in range(len(filtered_data)))
    denominator_y = (sum((y[i] - avg_y)) ** 2 for i in range(len(filtered_data)))
    
    # Calculate the denominator correctly
    denominator = (denominator_x * denominator_y) ** 0.5
    
    # Avoid division by zero
    correlation = numerator / denominator if denominator != 0 else 0
    
    return round(correlation, 4)

已知参考样本输出为0.4756,结果不应为0。

错误分析

问题出在correlation_coefficient函数的分母计算部分:

  1. 逻辑错误:计算分母时,应该是对每个(x[i]-avg_x)的平方求和,而非先求和所有(x[i]-avg_x)再平方(后者的结果理论上为0,因为均值的偏差和为0,平方后仍为0)。
  2. 语法错误:denominator_x和denominator_y被定义为生成器表达式,而非实际数值,直接相乘会导致类型错误,最终触发denominator == 0的分支返回0。

修复后的代码

修正correlation_coefficient函数中的分母计算逻辑:

def correlation_coefficient(filtered_data):
    if not filtered_data:
        return 0  

    x = [int(row[1]) for row in filtered_data]
    y = [int(row[9]) for row in filtered_data]

    avg_x = sum(x) / len(x)
    avg_y = sum(y) / len(y)

    numerator = sum((x[i] - avg_x) * (y[i] - avg_y) for i in range(len(filtered_data)))
    # 修正:对每个偏差值平方后求和
    denominator_x = sum((x[i] - avg_x) ** 2 for i in range(len(filtered_data)))
    denominator_y = sum((y[i] - avg_y) ** 2 for i in range(len(filtered_data)))
    
    denominator = (denominator_x * denominator_y) ** 0.5
    
    correlation = numerator / denominator if denominator != 0 else 0
    
    return round(correlation, 4)

验证说明

修复后,程序会正确计算皮尔逊相关系数的分母部分,避免因分母为0导致结果返回0,使用参考样本数据应得到0.4756的预期输出。

内容的提问来源于stack exchange,提问作者sansanotstark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:53:25