# 最大信息系数（MIC）

MIC（Maximal information coefficient）一个很神奇的东西，源自于2011年发在sicence上的一个论文。

p（x，y）是联合概率密度分布函数，想想就很难计算对不对，所以我们就要找一个办法来做这个事。怎么办呢？还记得蒙特卡洛么！这里有那么一点思想是这样的。

```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)```

```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()```

MIC的资料：

[1]Detecting novel associationsin large data sets

[2]Equitability Analysis of theMaximal Information Coefficient, with Comparisons [3]Equitability, mutual information, and themaximal information coefficient

0 条评论

• ### Python金融大数据分析-BSM、Term Struc、Ho-Lee 与Vasicek模型路径仿真

这一篇的代码是之前蒙特卡洛仿真改过来的，大家都知道，用MC绘制路径是一件很好玩的事情。在学习FRM的过程中，遇到了几种利率模型，Term Str...

• ### Python金融大数据分析-蒙特卡洛仿真

了解一点金融工程的对这个公式都不会太陌生，是用现在股价预测T时间股价的公式，其背后是股价符合几何布朗运动，也就是大名鼎鼎的BSM期权定价模型的基础。

• ### LINK : fatal erro…

VS2010在经历一些更新后，建立Win32 Console Project时会出“error LNK1123” 错误，解决方案为将 项目|项目属性|配置属...

• ### 设计模式之 - 策略落实

策略模式：它定义了算法家族，分别封装起来，让他们之间可以互相替换，此模式的变化，不会影响到使用算法的客户。

• ### 解决matplotlib.pyplot在Jupyter notebook中不显示图像问题

看莫烦老师的matplotlib教程中，有一段sinx函数动画，用Jupyter跑却不能显示动画效果。

• ### NumPy Beginner's Guide 2e 带注释源码 三、熟悉 NumPy 常用函数

离散卷积其实就是系数数组的多项式乘法。例如计算[1, 2, 0, 3]和[1, -2, 5]的卷积：

• ### java.lang.ClassNotFoundException与java.lang.NoClassDefFoundError的区别

以前一直没有注意过这个问题，前两天机缘巧合上网查了一下，然后自己测试验证了一下。虽然网上说法很多，但是关于NoClassDefFoundError并没有给...

• ### SVM梯度求导及实现

昨晚看了一部电影，叫做我是马布里，非常正能量，推荐给各位，看完这部电影的总结话是：

• ### 上下文系列小讲堂(四)

很多人下意识地的在脑子里把客户ID和订单日期排序，再手工添加个递增填充列就完事——典型的Excel思路

• ### [Sublime-Text] Linux下用Sublime-Text3编译输出Java文件

因为现在在借着经典的书籍巩固一些基础知识，所以会经常跑一些简单的程序，可又不想开庞大的IDE。所以就想试着用Sublime-Text来编译程序，哦，当然如果习惯...