大數據和機器學習研究 | ![]() |
[原]史上最直白的pca教程 之 二 |
pca的博文已經整理成一個完整的pdf文檔,在這裏下載:html http://download.csdn.net/detail/u011539200/9305773html5
不須要積分,累計人品,^_^java
做者:u011539200 發表於2015/11/27 16:48:26
原文連接
閱讀:15 評論:0
查看評論
|
[原]史上最直白的pca教程 之 一 |
PCA理論推導
X=⎛⎝⎜⎜⎜⎜x1,1x2,1...xm,1x1,2x2,2...xm,2............x1,nx2,n...xm,n⎞⎠⎟⎟⎟⎟
X∈Rm×n,式的每列是一個樣本,每一個樣本有m個屬性,一共有n個樣本。注意,這裏的每一個樣本都通過均值化處理。node 數據一般是含糊的,有噪聲的,不明確的。這種含糊和不明確,體如今它的協方差陣的多數元素都是非零值。好比,X的協方差陣就是:
CX=1n−1XXT
其中,1n−1是一個實數係數,CX∈Rm×m。
須要從數據找到一個不含糊的,低噪聲的方向。這個需求,在本質上就是尋找一個矩陣,用它對X作變換,使得變換後的新矩陣的協方差陣大多數元素的值是零,最好的狀況是,只有主對角線非零,其餘都是零。令P表示這個矩陣,則:
Y=PX
其中,P∈Rm×m,Y∈Rm×n。
根據上兩式,令 git
A=XXT
則:
A是一個對稱陣,對它進行對角化,能夠寫成A=EDET,其中,D是對角陣,{A,E,D}∈Rm×m。web 若是要將CY轉化成對角陣,觀察上式可知,若是令P=ET,根據矩陣對角化性質可知,P−1=PT,I表示單位陣,則上式就變成:
均值化PCA理論推導裏的X通過均值化處理的。均值化過程以下:
Z=⎛⎝⎜⎜⎜⎜z1,1z2,1...zm,1z1,2z2,2...zm,2............z1,nz2,n...zm,n⎞⎠⎟⎟⎟⎟
其中,Z∈Rm×n,是原始數據。 令:
zi¯¯¯=1n∑j=1nzi,j
那麼,均值化就是:
Z¯¯¯=⎛⎝⎜⎜⎜⎜z1,1−z1¯¯¯z2,1−z2¯¯¯...zm,1−zm¯¯¯¯z1,2−z1¯¯¯z2,2−z2¯¯¯...zm,2−zm¯¯¯¯............z1,n−z1¯¯¯z2,n−z2¯¯¯...zm,n−zm¯¯¯¯⎞⎠⎟⎟⎟⎟
實現用Python2.7,matplotlib和numpy實現pca算法。 #!/usr/bin/env python #! -*- coding:utf-8 -*- import matplotlib.pyplot as plt from numpy import * #create two data set def create_dataset(n): data_r = random.randn(n, 2) #squeez y for i in range(data_r.shape[0]): data_r[i, 1] = 0.1*data_r[i, 1] #rotate theta = -0.25*3.14 tran = zeros((2, 2)) tran[1, 1] = tran[0, 0] = cos(theta) tran[0, 1] = -sin(theta) tran[1, 0] = sin(theta) data = dot(data_r, tran) #move data[:, 0] += 3 data[:, 1] += 1 return data.transpose() def do_mean(X): means = zeros((X.shape[0],1)) means[0,0] = mean(X[0,:]) means[1,0] = mean(X[1,:]) for i in range(X.shape[0]): X[i,:] -= means[i,0] return X def do_pca(X): A = dot(X, X.transpose()) _ , E = linalg.eig(A) P = E.transpose() return dot(P, X) def draw_x(X): plt.axis([-3, 6, -6, 6]) plt.plot([z for z in X[0, :]], [z for z in X[1, :]], 'r.') plt.show() def main(): X = create_dataset(1000) draw_x(X) do_mean(X) new_X = do_pca(X) draw_x(new_X) if __name__ == "__main__": main() 該實現建立出一組數據,它近似高斯分佈,且主方向在45度角方向的直線上。 通過PCA算法處理後,數據X成爲以原點爲中心,水平方向是主方向的新數據。究其本質來講,new_X是數據X在以P爲基的二維空間的圖像。
做者:u011539200 發表於2015/11/27 16:43:48
原文連接
閱讀:68 評論:0
查看評論
|
[原]史上最直白的logistic regression教程 之 五 |
史上最直白的logistic regression教程整理稿,將4篇博文整理成一個完整的pdf文檔,且修改爲學術語境。 連接在這裏: http://download.csdn.net/detail/u011539200/9290695 0積分下載,求rp,^_^
做者:u011539200 發表於2015/11/22 15:57:46
原文連接
閱讀:46 評論:0
查看評論
|
[原]史上最直白的logistic regression教程 之 四 |
接上篇,用python實現logisitic regression,代碼以下: #!/usr/bin/env python #! -*- coding:utf-8 -*- import matplotlib.pyplot as plt from numpy import * #建立數據集 def load_dataset(): n = 100 X = [[1, 0.005*xi] for xi in range(1, 100)] Y = [2*xi[1] for xi in X] return X, Y def sigmoid(z): t = exp(z) return t/(1+t) #讓sigmodi函數向量化,能夠對矩陣求函數值,矩陣in,矩陣out sigmoid_vec = vectorize(sigmoid) #梯度降低法求解線性迴歸 def grad_descent(X, Y): X = mat(X) Y = mat(Y) row, col = shape(X) alpha = 0.05 maxIter = 5000 W = ones((1, col)) V = zeros((row, row), float32) for k in range(maxIter): L = sigmoid_vec(W*X.transpose()) for i in range(row): V[i, i] = L[0, i]*(L[0,i] - 1) W = W - alpha * (Y - L)*V*X return W def main(): X, Y = load_dataset() W = grad_descent(X, Y) print "W = ", W #繪圖 x = [xi[1] for xi in X] y = Y plt.plot(x, y, marker="*") xM = mat(X) y2 = sigmoid_vec(W*xM.transpose()) y22 = [y2[0,i] for i in range(y2.shape[1]) ] plt.plot(x, y22, marker="o") plt.show() if __name__ == "__main__": main() 跟前面相對,多了一點變化,sigmoid_vec是對sigmoid函數的向量化,以及計算對對V的計算。 咱們看看計算結果: Logistic regression教程到此結束,就醬!
做者:u011539200 發表於2015/11/19 16:19:26
原文連接
閱讀:71 評論:0
查看評論
|
[原]史上最直白的logistic regression教程 之 三 |
在線性擬合的基礎上,咱們實現logistic regression。 如前所述,樣本集是
{x1,y1},{x2,y2},...,{xn,yn}[1]
其中,xi=[1,xi,1,xi,2,xi,3,...,xi,k]T,且yi∈(0,1)。注意,這裏對yi有值上的要求,必須如此,若是值再也不這個區間,要以歸一化的方式調整到這個區間。對於分類問題,則yi的取值或者是0,或者是1,也就是yi∈{0,1}。
固然,從嚴格的意義上說,logistic regression擬合後,yi的值只能無限地逼近0和1,而不能真正達到0和1,但在處理實際問題上,能夠設定成形如 ifyi>0.5thenyi=1和ifyi<=0.5thenyi=0解決。 Logistic regression的擬合形式以下:
yi=f(zi)[2]
zi=Wxi[3]
其中,f(z)=11+e−z[4],也就是Logistic函數。
根據公式[2]和公式[3],則:
yi=f(Wxi)[4]
那麼,若是用公式[4]擬合xi和yi的關係,須要求解W,使得在公式[1]上偏差最小。對應的損失函數就是
Loss=12∑i=1n(yi−f(Wxi))2[5]
跟前面的同樣,咱們用梯度降低法求解。
∂Loss∂wj=∑i=1n(yi−f(Wxi))×(−1)×∂f(Wxi)∂wj=∑i=1n(yi−f(Wxi))×(−1)×∂f(zi)∂zi×∂zi∂wj[6]
注意,問題來了,公式[6]的最後一步,其實是將Wxi視爲一個變量zi,分別求導。這一步是在高等數學有詳細描述了,不解釋。 公式[6]中的∂f(zi)∂zi等價於f′(z),由於只有一個自變量z。根據公式[4],能夠求出
f′(z)=ez(ez+1)2[7]
對公式[7]能夠作一次變形,以方便求解: 根據公式[4],能夠知道
ez=f(z)1−f(z)[8]
將公式[8]代入到公式[7],就能夠獲得
f′(z)=f(z)×(1−f(z))[9]
也就是說,咱們能夠根據f(z)獲得f′(z),並且計算量很小。
把公式[9]代入公式[6],就獲得
∂Loss∂wj=∑i=1n(yi−f(Wxi))×(−1)×∂f(zi)∂zi×∂zi∂wj=∑i=1n(yi−f(Wxi))×(−1)×f(zi)×(1−f(zi))×∂zi∂wj=∑i=1n(yi−f(Wxi))×(−1)×f(Wxi)×(1−f(Wxi))×∂(Wxi)∂wj=∑i=1n(yi−f(W |