假設檢驗 分布檢驗 位置檢驗 彌散實驗 Ansari-Bradley
在matlab中,可使用ansaribradley進行Ansari-Bradley檢驗。 Bartlett’s test
巴特利特球形(Bartlett’s test)檢驗用來對虛假設進行檢驗。它以變數的相關係數矩陣為出發點。它的零假設相關係數矩陣是一個單位陣,即相關係數矩陣對角線上的所有元素都是1,所有非對角線上的元素都為零。巴特利特球形檢驗的統計量是根據相關係數矩陣的行列式得到的。如果該值較大,且對應的相伴機率值小於使用者心中的顯著性水平,那麼應該拒絕零假設,認為相關係數不可能是單位陣,即原始變數之間存在相關性,適合於作因子分析;相反,則不適合作因子分析。
Bartlett統計檢驗的日期運算式為:
χ2=(N−k)ln(S2p)−∑ki=1(ni−1)ln(S2i)1+13(k−1)(∑ki=1(1ni−1)−1N−k)
其中,第 k 個樣本的大小為 ni ,其樣本方差為 S2i ; N=∑i=1kni , S2p=1N−k∑i(ni−1)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=1n∑j=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=1n∑j=1mpijlogpijp⋅j
similarity, the conditional entropy of Y under the conditon of kowning X can be defined as
H(Y/X)=−∑i=1n∑j=1mpijlogpijpi⋅
資訊理論認為,系統越有序,則資訊熵越小;相反地,系統越混亂,則資訊熵越大.因此,資訊熵可以作為系統不確定性程度(或者說有序化程度)的度量標準.
最大資訊係數
最大資訊係數(MIC) 傳統的相關係數往往是針對特定的函數類型(如線性、指數、周期性函數)測量變數之間的相關性程度,而最大資訊係數可測量任何函數形式的相關性,所以最大資訊係數具有通用性;對於具有相等最大資訊係數取值的不同函數形式的資料而言,當給予同等程度的噪音,最大資訊係數的取值仍然保持相等,所以最大資訊係數具有均等性。
計算MIC可以使用minepy包,這個包有matlab、python和r版本,這個包可以到它的官網上進行下載。
相應的python常式1:
import numpy as npfrom minepy import MINEdef print_stats(mine): print "MIC", mine.mic()x = np.linspace(0, 1, 1000)y = np.sin(10 * np.pi * x) + xmine = MINE(alpha=0.6, c=15)mine.compute_score(x, y)print "Without noise:"print_stats(mine)printnp.random.seed(0)y +=np.random.uniform(-1, 1, x.shape[0]) # add some noisemine.compute_score(x, y)print "With noise:"print_stats(mine)
python常式2:
from __future__ import divisionimport numpy as npimport matplotlib.pyplot as pltfrom minepy import MINEdef 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 axdef 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()