相关分析

假设检验

分布检验

位置检验

弥散试验

Ansari-Bradley

在matlab中,可使用ansaribradley进行Ansari-Bradley检验。

Bartlett’s test

巴特利特球形(Bartlett’s test)检验用来对虚假设进行检验。它以变量的相关系数矩阵为出发点。它的零假设相关系数矩阵是一个单位阵,即相关系数矩阵对角线上的所有元素都是1,所有非对角线上的元素都为零。巴特利特球形检验的统计量是根据相关系数矩阵的行列式得到的。如果该值较大,且对应的相伴概率值小于用户心中的显著性水平,那么应该拒绝零假设,认为相关系数不可能是单位阵,即原始变量之间存在相关性,适合于作因子分析;相反,则不适合作因子分析。
Bartlett统计检验的数据表达式为:

χ2=(Nk)ln(S2p)ki=1(ni1)ln(S2i)1+13(k1)(ki=1(1ni1)1Nk)

其中,第 k 个样本的大小为ni,其样本方差为 S2i N=i=1kni S2p=1Nki(ni1)S2i 是方差的联合估计。
在matlab中使用Barttest函数来进行Bartlett检验。

方差分析

方差分析(ANOVA)是从观测变量的方差入手,研究诸多控制变量中哪些变量是对观测变量有显著影响的变量。

数据降维

特征变换技术通过将数据变换到新的特征来降低数据的维数。
当变量变换不可行时(如数据中的分类变量),特征选择技术更加适合。特征选择技术特别适合于最小二乘拟合。

因子分析(Factor analysis)

在Matlab中可使用factoran来进行因子分析。

回归算法

岭回归

岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
XTX 的行列式接近于0时,我们将其主对角元素都加上一个数 k ,可以使XTX奇异的风险大大降低。于是:

B(k)=(XTX+kI)1XTY

随着k的增大, B(k) 中各元素 bi(k) 的绝对值均趋于不断变小,它们相对于正确值 bi 的偏差也越来越大。 k 趋于无穷大时,B(k)趋于0。 b(k) k 的改变而变化的轨迹,就称为岭迹。实际计算中可选非常多的k值,做出一个岭迹图,看看这个图在取哪个值的时候变稳定了,那就确定 k 值了。

经典的线性相关分析方法难以有效探测数据的内丰结构与规律,基于互信息的度量准则,由于其具有能够有效刻画非线性相关系数的优势,而日益受到重视。
考虑有 n 个可能结果的随机变量X,其概率分布为 P(X=xi)=pi,i=12,...,n 。则其信息熵的定义为 H(X)=i=1npilogpi
Suppose that the joint probability of the stochastic variables (X,Y) is pij , the two-dimensional entropy of (X,Y) is

H(X,Y)=i=1nj=1mpijlogpij

Suppose that the marginal distribution of X and Y repectively are pi and pj˙ , the conditional entropy X under the conditon of kowning Y can be defined as
H(X/Y)=i=1nj=1mpijlogpijpj

similarity, the conditional entropy of Y under the conditon of kowning X can be defined as
H(Y/X)=i=1nj=1mpijlogpijpi

信息论认为,系统越有序,则信息熵越小;相反地,系统越混乱,则信息熵越大.因此,信息熵可以作为系统不确定性程度(或者说有序化程度)的度量标准.
最大信息系数(MIC) 传统的相关系数往往是针对特定的函数类型(如线性、指数、周期性函数)测量变量之间的相关性程度,而最大信息系数可测量任何函数形式的相关性,所以最大信息系数具有通用性;对于具有相等最大信息系数取值的不同函数形式的数据而言,当给予同等程度的噪音,最大信息系数的取值仍然保持相等,所以最大信息系数具有均等性。
计算MIC可以使用minepy包,这个包有matlab、python和r版本,这个包可以到它的 官网上进行下载。
相应的python例程1:

import numpy as np
from minepy import MINE

def print_stats(mine):
    print "MIC", mine.mic()


x = np.linspace(0, 1, 1000)
y = np.sin(10 * np.pi * x) + x
mine = MINE(alpha=0.6, c=15)
mine.compute_score(x, y)

print "Without noise:"
print_stats(mine)
print

np.random.seed(0)
y +=np.random.uniform(-1, 1, x.shape[0]) # add some noise
mine.compute_score(x, y)

print "With noise:"
print_stats(mine)

python例程2:

from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from minepy import MINE


def mysubplot(x, y, numRows, numCols, plotNum,
              xlim=(-4, 4), ylim=(-4, 4)):

    r = np.around(np.corrcoef(x, y)[0, 1], 1)
    mine = MINE(alpha=0.6, c=15)
    mine.compute_score(x, y)
    mic = np.around(mine.mic(), 1)
    ax = plt.subplot(numRows, numCols, plotNum,
                     xlim=xlim, ylim=ylim)
    ax.set_title('Pearson r=%.1f\nMIC=%.1f' % (r, mic),fontsize=10)
    ax.set_frame_on(False)
    ax.axes.get_xaxis().set_visible(False)
    ax.axes.get_yaxis().set_visible(False)
    ax.plot(x, y, ',')
    ax.set_xticks([])
    ax.set_yticks([])
    return ax

def rotation(xy, t):
    return np.dot(xy, [[np.cos(t), -np.sin(t)],
                       [np.sin(t), np.cos(t)]])

def mvnormal(n=1000):
    cors = [1.0, 0.8, 0.4, 0.0, -0.4, -0.8, -1.0]
    for i, cor in enumerate(cors):
        cov = [[1, cor],[cor, 1]]
        xy = np.random.multivariate_normal([0, 0], cov, n)
        mysubplot(xy[:, 0], xy[:, 1], 3, 7, i+1)

def rotnormal(n=1000):
    ts = [0, np.pi/12, np.pi/6, np.pi/4, np.pi/2-np.pi/6,
          np.pi/2-np.pi/12, np.pi/2]
    cov = [[1, 1],[1, 1]]
    xy = np.random.multivariate_normal([0, 0], cov, n)
    for i, t in enumerate(ts):
        xy_r = rotation(xy, t)
        mysubplot(xy_r[:, 0], xy_r[:, 1], 3, 7, i+8)

def others(n=1000):
    x = np.random.uniform(-1, 1, n)
    y = 4*(x**2-0.5)**2 + np.random.uniform(-1, 1, n)/3
    mysubplot(x, y, 3, 7, 15, (-1, 1), (-1/3, 1+1/3))

    y = np.random.uniform(-1, 1, n)
    xy = np.concatenate((x.reshape(-1, 1), y.reshape(-1, 1)), axis=1)
    xy = rotation(xy, -np.pi/8)
    lim = np.sqrt(2+np.sqrt(2)) / np.sqrt(2)
    mysubplot(xy[:, 0], xy[:, 1], 3, 7, 16, (-lim, lim), (-lim, lim))

    xy = rotation(xy, -np.pi/8)
    lim = np.sqrt(2)
    mysubplot(xy[:, 0], xy[:, 1], 3, 7, 17, (-lim, lim), (-lim, lim))

    y = 2*x**2 + np.random.uniform(-1, 1, n)
    mysubplot(x, y, 3, 7, 18, (-1, 1), (-1, 3))

    y = (x**2 + np.random.uniform(0, 0.5, n)) * \
        np.array([-1, 1])[np.random.random_integers(0, 1, size=n)]
    mysubplot(x, y, 3, 7, 19, (-1.5, 1.5), (-1.5, 1.5))

    y = np.cos(x * np.pi) + np.random.uniform(0, 1/8, n)
    x = np.sin(x * np.pi) + np.random.uniform(0, 1/8, n)
    mysubplot(x, y, 3, 7, 20, (-1.5, 1.5), (-1.5, 1.5))

    xy1 = np.random.multivariate_normal([3, 3], [[1, 0], [0, 1]], int(n/4))
    xy2 = np.random.multivariate_normal([-3, 3], [[1, 0], [0, 1]], int(n/4))
    xy3 = np.random.multivariate_normal([-3, -3], [[1, 0], [0, 1]], int(n/4))
    xy4 = np.random.multivariate_normal([3, -3], [[1, 0], [0, 1]], int(n/4))
    xy = np.concatenate((xy1, xy2, xy3, xy4), axis=0)
    mysubplot(xy[:, 0], xy[:, 1], 3, 7, 21, (-7, 7), (-7, 7))

plt.figure(facecolor='white')
mvnormal(n=800)
rotnormal(n=200)
others(n=800)
plt.tight_layout()
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值