线性相关系数、卡方检验、互信息

线性相关系数、卡⽅检验、互信息
线性相关系数、卡⽅检验、互信息
相信⼤家在数据挖掘的很多地⽅⼤家都看到这三个概念,⽐如说线性拟合的时候,看线性相关系数来评估拟合程度;在特征⼯程中,这三个都是filter类⽅法之⼀(过滤型)。那今天给⼤家总结下这三个概念,个⼈才疏学浅,有啥问题还请⼤家批评指正。
线性相关系数
也叫Pearson相 关 系 数, 主要衡量两个变量线性相关的程度,由卡尔·⽪尔森1880年提出。它的公式为
其中是的平均值,是的平均值。的取值[-1,1]。越接近1,表⽰越相关,其中负数表⽰负相关。
需要特别注意的是:
1. 线性相关系数必须建⽴在因变量与⾃变量是线性的关系基础上,否则线性相关系数是⽆意义的。实例可以参看。
2. 从公式中可以看出,如果只有⼀个数据,分母为0,线性相关系数也是⽆意义的。其实少量数据量,计算线性相关性也是⽆意义的(怎么画那条直线呢)。
因此,建议在给出线性相关系数之前,画图展⽰下数据的分布。
线性相关系数python代码实现
import sys
import re
import math
def matrix_multiply(x, y):
fxy = 0.0
for i in range(len(x)):
fxy = fxy + x[i]*y[i]
return fxy;
def compute_pearson_correlation_coefficient(x_label, y_label):
no = len(x_label);
sum_x = sum(x_label)
sum_y = sum(y_label);
fxy = matrix_multiply(x_label, y_label);
fx2 = sum([pow(i,2) for i in x_label])
混合所有制与国企改革新思路
fy2 = sum([pow(j,2) for j in y_label])
#分⼦
numerator = no*fxy - float(sum_x)*float(sum_y);
#分母
denominator = math.sqrt((no*fx2-float(sum_x**2))*(no*fy2-float(sum_y**2)))
return numerator*1.0/denominator
计算⽰例为,计算⽉⽉销售额跟⼴告投⼊的关系:
卡⽅检验
卡⽅检验(chi-square test),也叫作检验。卡⽅检验有多种⽅法,最著名的就是⽪尔逊卡⽅检验,也是卡尔·⽪尔森提出(被誉为现代统计科学的创⽴者,⽜掰)。我们通常⽤卡⽅来检测两个变量or样本的独⽴性。
卡⽅检验的理论假设是:⼀个样本中已发⽣事件的次数分配会遵守某个特定的理论分配。通常的讲:观测频数跟实际频数应该没有区别,除⾮两个变量不是独⽴的。举个例⼦:XX公司不同部门职员的性别跟部门两者是独⽴的么?很明显不是哦。这⼉我们的期望男⼥⽐例是
1.05:1,但是在IT研发部分,⽐例可能是3:1,在HR、客服等部门,⽐率可能是1:3了。因此这⼉的观测值就跟实际值不⼀致,我们就可以说两个不是独⽴的。
卡⽅检验通常有三个步骤
1. 计算卡⽅统计值,统计值的公式是:
2. 计算⾃由度
3. 依据研究者设定的置信⽔准,查出⾃由度为 的卡⽅分配临界值,⽐较它与第1步骤得出的统计值,推论能否拒绝虚⽆假设。如果1计算出来的统计值⼤于表的值,则可以拒绝两个独⽴的假设,也就是说两者相关的,越相关值越⼤。
从这⼉可以看出, ⽐线性相关系数作⽤会⼴⼀些,因为它没有线性的前提假设。但是卡⽅检验时需要查卡⽅临界表,但是⽐较相关性⼤⼩就可以不⽤了。
对于连续型的特征,怎么计算卡⽅分布呢?这⼉需要将连续型的特征进⾏分段,变为离散的特征然后再计算卡⽅分布。
卡⽅检验python代码实现
import sys
安全责任 重在落实import re
import math
def gen_observe_list(x, y):
'''
⽣成观测数组
'''
feature_no = len(x[0])
label_dict = {};
label_no = 0;
for i in y:
if i not in label_dict:
法制论坛if i not in label_dict:
label_dict[i] = label_no
label_no = label_no + 1
observe_list = [([0] * (feature_no+1)) for i in range(label_no + 1)]
idx = 0;
while idx < len(x):
label = y[idx]
y_idx = label_dict[label];
features = x[idx];
x_idx = 0;
while x_idx < len(features):
observe_list[idx+1][0] = observe_list[idx+1][0] + features[x_idx]
observe_list[idx+1][x_idx+1] = observe_list[idx+1][x_idx+1] + features[x_idx]
observe_list[0][x_idx+1] = observe_list[0][x_idx+1] + features[x_idx]
observe_list[0][0] = observe_list[0][0] + features[x_idx]
observe_list
x_idx = x_idx+1;
idx = idx + 1
return observe_list
def gen_expect_list(observe_list):
'''
计算期望数组
'''
expect_list = [([0.0] * len(observe_list)) for i in range(len(observe_list[0]))]
x_idx = 0
出租汽车驾驶员从业资格管理规定
y_idx = 1;
while y_idx < len(observe_list):
x_idx = 1
while x_idx < len(observe_list[0]):
expect_list[y_idx][x_idx] = observe_list[y_idx][0]*observe_list[0][x_idx]*1.0/observe_list[0][0]            x_idx = x_idx + 1
y_idx = y_idx + 1
return expect_list
def compute_chi2(x, y):
if len(x) != len(y) or len(x) < 2:
print >>sys.stderr, "feature is "
observe_list = gen_observe_list(x, y)
expect_list = gen_expect_list(observe_list);
##计算chi2
y_idx = 1;
chi2 = [0.0] * len(expect_list[0]);
while y_idx < len(observe_list):
x_idx = 1
while x_idx < len(observe_list[0]):
expect_val = expect_list[y_idx][x_idx];
observe_val = observe_list[y_idx][x_idx];
chi_val = 1.0*(expect_val - observe_val)**2/expect_val
chi2[0] = chi2[0] + chi_val;
chi2[x_idx] = chi2[x_idx] + chi_val;
x_idx = x_idx + 1;
y_idx = y_idx + 1
return chi2
具体实例可以参看wikipedia。
互信息
互信息的概念来⾃于信息熵,相信⼤家在很多机器学习,数据挖掘的数据都有看到。互信息⼴泛使⽤在特征选择、机器学习数模型中。
在概率论和信息论中,互信息是两个随机变量的互信息(Mutual Information,简称MI)或转移信息(transinformation)是变量间相互依赖性的量度。通俗的来讲:互信息是⼀个随机变量包含另外⼀个随机变量的信息量,或者说如果已知⼀个变量,另外⼀个变量减少的信息量。
互信息的公式为:
互信息有如下信息:
1. 当且仅当 和 为独⽴随机变量。从⼀个⽅向很容易看出:当 和 独⽴时,,因此:
2. 互信息是对偶的。也就是说。
3. 互信息是⾮负的。从概念上来讲,互信息是已知⼀个变量,另外⼀个变量减少的信息量,减少的信息量最少为0(两个不相关),不可能减少为负吧。
4. 。详细推导为:
5. 需要注意的是,互信息也是只能处理离散的特征。如果连续的情况,需要先离散化。
互信息python代码实现
import sys
import re
import math
def gen_info_data(x, y):
'''
基础统计
'''
feature_no = len(x[0])
label_dict = {};
label_no = 0;
for i in y:
if i not in label_dict:
label_dict[i] = label_no
label_no = label_no + 1
info_data = [([0] * (feature_no+1)) for i in range(label_no + 1)]
idx = 0;
while idx < len(x):
label = y[idx]
y_idx = label_dict[label];
features = x[idx];
x_idx = 0;
while x_idx < len(features):
info_data[idx+1][0] = info_data[idx+1][0] + features[x_idx]
info_data[idx+1][x_idx+1] = info_data[idx+1][x_idx+1] + features[x_idx]
info_data[0][x_idx+1] = info_data[0][x_idx+1] + features[x_idx]
info_data[0][0] = info_data[0][0] + features[x_idx]
info_data
x_idx = x_idx+1;
idx = idx + 1
return info_data质谱流式细胞技术
def compute_mutual_information(x, y):
苄丝肼if len(x) != len(y) or len(x) < 2:
print >>sys.stderr, "feature is "
info_data = gen_info_data(x, y)
mut_info = [0.0] * len(info_data[0]);
ret_data = 1.0;
x_idx = 1;
y_idx = 1;
total = info_data[0][0];
while y_idx < len(info_data):
x_idx = 1
while x_idx < len(info_data[0]):
mut_info_val = info_data[y_idx][x_idx]*1.0/total*math.log(1.0*info_data[y_idx][x_idx]*total/(info_data[y_idx][0]*info_data[0][x_idx]))/math.log(2);            mut_info[0] = mut_info[0] + mut_info_val
mut_info[x_idx] = mut_info[x_idx] + mut_info_val
x_idx = x_idx + 1;
y_idx = y_idx + 1;
return mut_info;

本文发布于:2024-09-22 06:56:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/184393.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:互信息   计算   变量
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议