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函数的分母计算部分:
- 逻辑错误:计算分母时,应该是对每个
(x[i]-avg_x)的平方求和,而非先求和所有(x[i]-avg_x)再平方(后者的结果理论上为0,因为均值的偏差和为0,平方后仍为0)。 - 语法错误:
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
相关产品推荐
相关产品推荐

