hanfeng 2024-01-30T00:49:15+00:00 zhuhanfeng@gmail.com Knowledge Graph 2014-05-07T00:00:00+00:00 hanfeng http://mlnotes.com/2014/05/07/kg ]]> Config GoAgent for Vmware 2014-02-02T00:00:00+00:00 hanfeng http://mlnotes.com/2014/02/02/vmware_proxy Problem Description

Solution

To Be Done

]]>
Principal Component Analysis(PCA) 2013-08-28T00:00:00+00:00 hanfeng http://mlnotes.com/2013/08/28/pca Covariance Matrix

Suppose $$$ X $$$ is a $$$ n \times p $$$ matrix, where n is the number of objects and p is the number of features. $$$X$$$ is zero mean.

$$ X^T X = nV $$ $$$ V $$$ is the covariance matrix of $$$X$$$, and it's obvious that $$$V$$$ is a symmetric and positive-definite matrix.

Minimize Residuals

In PCA, we want to project the original data into a lower space, suppose we want to project the p-dimensional data into line space, and the unit vector of the line is $$$ \vec{w} $$$, then for $$$ \vec{x}_i $$$ the projection is $$$ \vec{x}_i \cdot \vec{w} $$$, and the coordinate in p-dimensional space is $$$ (\vec{x}_i \cdot \vec{w}) \vec{w} $$$. The residual is:

$$ \begin{eqnarray*} \|\vec{x}_i - (\vec{x}_i \cdot \vec{w}) \vec{w}\|^2 &=& \|\vec{x}_i\|^2-2(\vec{x}_i\cdot\vec{w})^2 + \|(\vec{x}_i \cdot \vec{w})\vec{w}\|^2 \\ &=& \|\vec{x}_i\|^2 - (\vec{x}_i \cdot \vec{w})^2 \end{eqnarray*} $$

For all vectors, the residuals is:

$$ \begin{eqnarray*} RSS(\vec{w}) &=& \sum_{i=1}^n\|\vec{x}_i\|^2 - \sum_{i=1}^n(\vec{x}_i \cdot \vec{w})^2 \\ \end{eqnarray*} $$

Because $$$\| \vec{x}_i \|^2$$$ does not depend on $$$\vec{w}$$$, to minimize RSS, we need to maximize $$$ \sum_{i=1}^n(\vec{x}_i \cdot \vec{w})^2 $$$. Because $$$ X$$$ is zero mean, so

$$ \begin{eqnarray*} E(X\vec{w}) &=& \frac{1}{n}\sum_{i=1}^n \vec{x}_i\vec{w} \\ &=& (\frac{1}{n}\sum_{i=1}^n \vec{x}_i) \vec{w} \\ &=& E(X)\vec{w} \\ &=& 0 \end{eqnarray*} $$ $$ \begin{eqnarray*} \sum_{i=1}^n(\vec{x}_i \cdot \vec{w})^2 &=& \sum_{i=1}^n(\vec{x}_i \cdot \vec{w} - 0)^2 \\ &=& \sum_{i=1}^n(\vec{x}_i\cdot\vec{w} - E(X\vec{w}))^2 \\ &=& n\frac{1}{n}\sum_{i=1}^n(\vec{x}_i\cdot\vec{w} - E(X\vec{w}))^2 \\ &=& n Var(X\vec{w}) \end{eqnarray*} $$

Now we can transform RSS into:

$$ \begin{eqnarray*} RSS(\vec{w}) &=& \sum_{i=1}^n \|\vec{x}_i\|^2 - \sum_{i=1}^n(\vec{x}_i \cdot \vec{w})^2 \\ &=& \sum_{i=1}^n \|\vec{x}_i\|^2 - n Var(X\vec{w}) \end{eqnarray*} $$

So, in order to minimize RSS, we just need to maximize variance $$$Var(X\vec{w})$$$.

$$ \begin{eqnarray*} \sigma^2 &=& \frac{1}{n}\sum_{i=1}^n(\vec{x}_i\cdot\vec{w})^2 \\ &=& \frac{1}{n}(X\vec{w})^T(X\vec{w}) \\ &=& \frac{1}{n}\vec{w}^TX^TX\vec{w} \\ &=& \vec{w}^T \frac{X^TX}{n} \vec{w} \\ &=& \vec{w}^T V \vec{w} \end{eqnarray*} $$

What we want to do is to find a unit vector $$$\vec{w}$$$, so that $$$\sigma^2$$$ can be maximized. Let $$$f(\vec{w}) = \vec{w}^TV\vec{w}$$$ and $$$ g(\vec{w}) = \vec{w}^T\vec{w}$$$. We want to maximize $$$f(\vec{w})$$$ with respect to $$$ g(\vec{w}) = 1 $$$. To solve this problem, we can add a Lagrange multiplier $$$ \lambda $$$ and construct a new function.

$$ L(\vec{w}, \lambda) = f(\vec{w}) - \lambda(g(\vec{w}) - 1) $$

This is our new objective function, so we differentiate with repsect to both arguments and set the derivatives equal to zero:

$$ \begin{eqnarray*} \frac{\partial L}{\partial \vec{w}} &=& \frac{\partial f(\vec{w})}{\partial \vec{w}} - \lambda \frac{\partial g(\vec{w})}{\partial \vec{w}}= 0 \\ \frac{\partial L}{\partial \lambda} &=& -g(\vec{w}) + 1 = 0 \end{eqnarray*} $$

Maximizing with respect to $$$\lambda$$$ gives us back our constriant equation. If $$$\lambda$$$ were zero, then the objective function would be unconstrained, the bigger $$$\lambda$$$ is, the more constraint "bites". Because we have to satisfy the constraint, we need to ensure $$$ \lambda \neq 0 $$$, so that the maximized value of L are equal to the origin objective function f with constraint g=1. For V is a symmetric matrix, so we have $$$ \frac{\partial \vec{w}^TV\vec{w}}{\partial \vec{w}} = 2V\vec{w}$$$.

$$ \begin{eqnarray*} \frac{\partial f}{\partial \vec{w}} - \lambda\frac{\partial g}{\partial \vec{w}} &=& 0 \\ \frac{\partial \vec{w}^TV\vec{w}}{\partial \vec{w}} - \lambda\frac{\partial \vec{w}^T\vec{w}}{\partial \vec{w}} &=& 0 \\ 2V\vec{w} - 2\lambda\vec{w} &=& 0 \\ V\vec{w} &=& \lambda\vec{w} \end{eqnarray*} $$

It's obvious that $$$\vec{w}$$$ is an eigenvector of V and $$$\lambda$$$ is an eigenvalue of V.This is good news, because finding eigenvectors is something that can be done comparatively rapidly, besides eigenvectors have many nice mathematical properties.

Eigenvector

For any square matrix $$$A$$$ and any nonzero vector $$$\vec{w}$$$, if $$$A\vec{w} = \lambda \vec{w}$$$, then $$$\vec{w}$$$ is the eigenvector of A and $$$\lambda$$$ is the eigenvalue of A. Suppose $$$I$$$ is the identity matrix, then we have $$$ (A - \lambda I)\vec{w} = 0 $$$. Because $$$\vec{w}$$$ is nonzero, $$$ (A-\lambda I) $$$ must be singular, that is $$$ |A - \lambda I| = 0 $$$, a n degree equation. According to the property of n degree equation, we will n $$$\lambda$$$s, some of them may be the same, or even complex numbers. There are two common properties for eigenvalues:

  • $$$ \sum_{i=1}^n \lambda_i = trace(A) $$$
  • $$$ \prod_{i=1}^n \lambda_i = |A| $$$

If the matrix A is symmetric, then the eigenvector has another nice property:

  • $$$\vec{w}_i \cdot \vec{w}_j = 0 $$$, that is the eignevectors of a symmetric matrix are </strong>orthogoanl</strong>.

Now, let's prove this property. First, for any real matrix A, and any vector $$$\vec{x}$$$, $$$\vec{y}$$$, we have

$$ \begin{eqnarray*} \langle A\vec{x}, \vec{y} \rangle &=& (A\vec{x})^T \vec{y} = \vec{x}^T A^T \vec{y} \\ \langle \vec{x}, A^T\vec{y} \rangle &=& \vec{x}^T A^T \vec{y} \\ \langle A\vec{x}, \vec{y} \rangle &=& \langle \vec{x}, A^T \vec{y} \rangle \end{eqnarray*} $$

Suppose A is a symmetric matrix, that is $$$ A^T = A$$$, and two distinct eigenvalues $$$\lambda_i$$$, $$$\lambda_j$$$, with corresponding eigenvectors $$$\vec{w}_i , \vec{w}_j$$$. From the above we have:

$$ \begin{eqnarray*} \lambda_i \langle \vec{w}_i, \vec{w}_j \rangle &=& \langle \lambda_i\vec{w}_i, \vec{w}_j \rangle \\ &=& \langle A\vec{w}_i, \vec{w}_j \rangle \\ &=& \langle \vec{w}_i, A^T\vec{w}_j \rangle \\ &=& \langle \vec{w}_i, A\vec{w}_j \rangle \\ &=& \langle \vec{w}_i, \lambda_j \vec{w}_j \rangle \\ &=& \lambda_j \langle \vec{w}_i, \vec{w}_j \rangle \end{eqnarray*} $$

Because $$$\lambda_i \neq \lambda_j $$$, so $$$\langle \vec{w}_i, \vec{w}_j \rangle = 0$$$ which means that the eigenvectors of a symmetric matrix are orthogonal.

Transform matrix

Now let's go back to PCA, because covariance matrix $$$V$$$ is positive-definite, for any vector $$$\vec{v}$$$, $$$\vec{v}^TV\vec{v} \geq 0 $$$. So the eigenvalues of V are non-negative. And the eigenvectors of V are the Principal Component of the data. Usually we pick the biggest q positive eigenvalues, and using their eigenvectors to construct a q-dimensional basis, because these eigenvectors are orthogonal, so they can span the whole q-dimensional space. These q eigenvectors comprise a $$$ p \times q $$$ transform matrix $$$W$$$, and this matrix what we use to reduce the dimension of q-dimensional data to p-dimensional data.

]]>
Regular Expression Matching(LeetCode) 2013-08-27T00:00:00+00:00 hanfeng http://mlnotes.com/2013/08/27/leetcode_regx
#include <iostream>
#include <string>

using namespace std;

bool isMatch(const char *s, const char *p)
{
	if(p[0] == '*')
		return false;
	else if(p[0] == 0)
		return s[0] == 0;
	else if(p[0] == '.')
	{
		if(p[1] == '*')
		{
			if(p[2] == 0)
				return true;

			if(isMatch(s, p+2))
				return true;

			for(const char *snext = s; ; ++snext)
			{
				if(snext[0] == 0)
					return false;
				if(isMatch(snext+1, p+2))
					return true;
			}
		}
		else
		{
			return s[0] && isMatch(s+1, p+1);
		}
	}
	else
	{
		// normal character
		if(p[1] == '*')
		{
			if(isMatch(s, p+2))
				return true;

			for(const char *snext=s; ; ++snext)
			{
				if(snext[0] != p[0])
					return false;

				if(isMatch(snext+1, p+2))
					return true;
			}
		}
		else
		{
			return (s[0] == p[0]) && isMatch(s+1, p+1);
		}
	}
}


int main()
{
	string s, p;
	while(true)
	{
		cin >> s >> p;
		cout << isMatch(s.c_str(),p.c_str()) << '\n';
	}
}
]]>
Longest Palindromic Substring(LeetCode) 2013-08-24T00:00:00+00:00 hanfeng http://mlnotes.com/2013/08/24/lrs_leetcode
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <string>
#include <iostream>
using namespace std;

string longestPalindrome(string s)
{
    // Start typing your C/C++ solution below
    // DO NOT write int main() function

	int size = s.size();
	char *str = new char[size*2+3];
	str[0] = '$';
	str[1] = '#';
	str[size*2+2] = 0;
	for(int i = 0; i < size; ++i)
	{
		str[2*i+2] = s[i];
		str[2*i+3] = '#';
	}

	int *p = new int[size*2+2];
	memset(p, 0, sizeof(int)*(size*2+2));
	p[0] = 1;
	int mid = 0;
	int mx = 1;
	int maxi = 0;
	int maxlen = 1;
	for(int i = 1; str[i]; ++i)
	{
		if(mx > i)
			p[i] = min(p[2*mid-i], mx-i);
		else
			p[i] = 1;

		while(str[i-p[i]] == str[i+p[i]])
			p[i]++;

		if(mx < i+p[i])
		{
			mx = i + p[i];
			mid = i;
		}

		if(maxlen < p[i])
		{
			maxlen = p[i];
			maxi = i;
		}
	}

	delete str;
	delete p;

	return s.substr((maxi-maxlen+1)/2, maxlen-1);
}

int main()
{
	string s;
	while(true)
	{
		cin >> s;
		cout << longestPalindrome(s) << '\n';
	}
}
]]>
Cholesky Decomposition 2013-08-22T00:00:00+00:00 hanfeng http://mlnotes.com/2013/08/22/cholesky 三角矩阵

三角矩阵首先是方阵,其次,如果这个方阵对角线上面或下面(不含对角线)的元素都为0的话,那么这个矩阵就被称为三角矩阵。如果是上面的元素都为0,则称之为下三角矩阵,反之则是上三角矩阵。

$$ \mathbf{上三角矩阵} \begin{bmatrix} a_{11} & a_{12} & ... & a_{1n} \\ 0 & a_{22} & ... & a_{2n} \\ 0 & 0 & ... & a_{3n} \\ ... & ... & ... & .... \\ 0 & 0 & 0.. & a_{nn} \\ \end{bmatrix} $$ $$ \mathbf{下三角矩阵} \begin{bmatrix} a_{11} & 0 & ... & 0 \\ a_{21} & a_{22} & 0.. & 0 \\ a_{31} & a_{32} & ... & 0 \\ ... & ... & ... & ... \\ a_{n1} & a_{n2} & ... & a_{nn} \\ \end{bmatrix} $$

三角矩阵有一个非常好的性质,那就是在作为一个方程组的参数时,那么可以快速地解这个方程组,假设矩阵A是一个下三角矩阵,那么方程组 $$$ Ax = b $$$,可以很快地解出,解普通方程组节省很多时间,这个方程组的解具有如下形式

$$ \begin{eqnarray*} x_1 &=& \frac{b_1}{a_{11}} \\ x_2 &=& \frac{b_2 - a_{21}x_1}{a_{22}} \\ x_3 &=& \frac{b_3 - a_{31}x_1 - a_{32}x_2}{a_{33}} \\ ... \\ x_n &=& \frac{b_n - \sum_{i=1}^{n-1} a_{ni}x_i }{a_{nn}} \end{eqnarray*} $$

Cholesky Descomposition

由于三角矩阵具有非常好的性质,因此我们在计算时,我们可以把一个矩阵分解成两个三角矩阵乘积的形式,从而可以利用三角矩阵的优点,但并不是任何矩阵都可以转化成三角矩阵形式的。在实数域,只有正定矩阵(positive defined matrix)才满足条件。假设矩阵A是堆成的正定矩阵,把A分解成如下形式就是Cholesky Decomposition,其中U为上三角矩阵,L为下三角矩阵。 $$ \begin{eqnarray*} A &=& U^T U \\ A &=& L L^T \end{eqnarray*} $$

正定矩阵

首先我们需要知道什么是正定矩阵。首先正定矩阵是对称的,对称很容易理解,即矩阵A中的所有元素,有$$$ a_{ij} = a_{ji}$$$,那么A必然是方阵;此外对于任何非零的向量z,正定矩阵A满足$$$ z^T A z > 0 $$$。正定矩阵还有如下性质:

  • 正定矩阵是非奇异矩阵。假设A为正定矩阵,对于任意非零向量x,满足 $$ x^T A x > 0 $$ 那么我们可以得到 $$ A x \neq 0 $$ 所以正定矩阵是非奇异矩阵。
  • 对角线上的所有元素都是正的。令$$$e_i$$$表示第i个元素为1,其余为0的单位向量,那么 $$ a_{ii} = e_i^T A e_i > 0 $$
  • 正定矩阵的Schur补也是正定矩阵。对于正定矩阵 $$ A_n = \begin{bmatrix} a_{11} & a_{n1}^T \\ a_{n1} & A_{n-1} \end{bmatrix} $$ 其中$$$a_{11}$$$为实数,$$$a_{n1}$$$为向量,$$$A_{n-1}$$$为方阵。$$$A_n$$$的Schur补为 $$ S = A_{n-1} - \frac{1}{a_{11}} a_{n1} a_{n1}^T $$ 令w为实数,v为长度为n-1的任意向量,由于$$$A_n$$$为正定矩阵,因此我们有 $$ \begin{eqnarray*} [w, v^T] A_n [w, v^T]^T &>& 0 \\ w^2a_{11} + wv^T a_{n1} + wa_{n1}^Tv + v^TA_{n-1}v &>& 0 \end{eqnarray*} $$ 要证明S为正定矩阵,只需要证明对于任意非零向量v,$$$v^T S v > 0 $$$即可,也就要证明 $$ \begin{eqnarray*} v^T A_{n-1} v - \frac{1}{a_{11}}v^T a_{n1} a_{n1}^T v > 0 \end{eqnarray*} $$ 观察上面两个不等式发现,只需要令 $$ \begin{eqnarray*} w^2a_{11} + wv^Ta_{n1} + wa_{n1}^Tv + v^TA_{n-1}v&=& v^TA_{n-1}v- \frac{1}{a_{11}} v^Ta_{n1}a_{n1}^Tv \\ w^2a_{11} + 2w v^Ta_{n1} + \frac{1}{a_{11}}(v^T a_{n1})^2 &=& 0 \\ w^2 + \frac{2v^Ta_{n1}}{a_{11}}w + (\frac{(v^T a_{n1})}{a_{11}})^2 &=& 0 \\ (w + \frac{v^T a_{n1}}{a_{11}})^2 &=& 0 \\ w &=& -\frac{1}{a_{11}} v^T a_{n1} \end{eqnarray*}$$ 所以对任意的非零向量v,我们可以令$$$w = -\frac{1}{a_{11}} v^T a_{n1} $$$,根据$$$A_n$$$的性质,我们可以证明$$$v^T S v > 0$$$。因此,正定矩阵的Schur补也是正定矩阵。

为什么正定矩阵可以分成三角矩阵的乘积?

假设正定矩阵可以分解为两个三角矩阵的乘积。不妨令$$$ A_n = L_n L_n^T $$$,同时分别将$$$A_n$$$ 和 $$$L_n$$$ 写作

$$ \begin{eqnarray*} A_n &=& \begin{bmatrix} a_{11} & a_{n1}^T \\ a_{n1} & A_{n-1} \end{bmatrix} \\ L_n &=& \begin{bmatrix} l_{11} & 0 \\ l_{n1} & L_{n-1} \end{bmatrix} \end{eqnarray*} $$ 如果我们能证明下面的等式成立,那么我们就证明了正定矩阵可以分成了两个三角矩阵的乘积。 $$\begin{eqnarray*} A_n &=& L_n L_n^T \\ \begin{bmatrix} a_{11} & a_{n1}^T \\ a_{n1} & A_{n-1} \end{bmatrix} &=& \begin{bmatrix} l_{11} & 0 \\ l_{n1} & L_{n-1} \end{bmatrix} \begin{bmatrix} l_{11} & l_{n1}^T \\ 0 & L_{n-1}^T \end{bmatrix} &=& \begin{bmatrix} l_{11}^2 & l_{11}l_{n1}^T \\ l_{11}l_{n1} & l_{n1}l_{n1}^T + L_{n-1}L_{n-1}^T \end{bmatrix} \end{eqnarray*}$$

由于$$$A_n$$$是正定矩阵,而正定矩阵对角线上的元素都为正,因而$$$a_{11} > 0 $$$,所以我们得到

$$ l_{11} = \sqrt{a_{11}} $$

因为 $$$ a_{n1} = l_{11}l_{n1} $$$,所以我们可以得到

$$ l_{n1} = \frac{1}{\sqrt{a_{11}}} a_{n1} $$

至此,我们只需要证明 $$$ A_{n-1} = l_{n1}l_{n1}^T + L_{n-1}L_{n-1}^T $$$,既可以证明正定矩阵可以分解成三角矩阵的乘积,也就是证明

$$\begin{eqnarray*} A_{n-1} - l_{n1}l_{n1}^T &=& L_{n-1}L_{n-1}^T \\ A_{n-1} - \frac{1}{a_{11}} &=& L_{n-1}L_{n-1}^T \end{eqnarray*}$$

观察上面的等式,我们发现,只需要证明 $$$ A_{n-1} - \frac{1}{a_{11}} $$$ 是正定矩阵就可以了。而这个表达式恰好是矩阵$$$A_n$$$的Schur补,根据正定矩阵的性质,我们知道这个表达式也是正定矩阵。接着我们采用归纳证明,假设维度为n-1的正定矩阵可以分解成下三角矩阵和上三角矩阵的乘积,那么根据上面的分析,我们知道维度为n的正定矩阵也可以分解成下三角矩阵和上三角矩阵的乘积;当n=1时,显然可以分解成三角矩阵的乘积。因此我们证明了$$$ A_{n-1} = l_{n1}l_{n1}^T + L_{n-1}L_{n-1}^T$$$,从而也就证明了Cholesky Decomposition。

在Least Angle Regression 中的运用

在最小角回归中,有一个矩阵$$$X_A$$$是专门用来记录选中的特征,在每一步中我们都需要计算$$$(X_A^T X_A)^{-1}$$$。$$$X_A = (...,s_jX_j,...) $$$,$$$X_j$$$ 表示被选择的特征,$$$s_j$$$表示$$$X_j$$$与期望输出相关性的正负。$$$X_A$$$是逐渐增大,一般在最小角回归的每一步中增加一个列向量,正是这个特点,可以使我们利用Cholesky Decomposition来简化逆矩阵的计算。

上面已经证明过正定矩阵一定可以分解为下三角矩阵和上三角矩阵的乘积。所以$$$ X_A^T X_A$$$是正定矩阵的话,那么它也可以分解为三角矩阵的乘积。显然,这是很好证明的,首先由于需要计算$$$X_A^TX_A$$$的逆矩阵,所以最小角回归的前提必然要求所有的特征向量都是线性无关的,这是前提条件。既然$$$X_A^TX_A$$$存在逆矩阵,那么对于任意非零的向量z,$$$z^T X_A^T X_A z = (X_Az)^T(X_Az) > 0$$$,因为如果等于0的话,必然要求$$$X_Az = 0$$$,这样的话就说明存在线性相关的特征向量,与前提矛盾。所以至此我们证明了$$$X_A^T X_A$$$是正定矩阵。

由于$$$X_A^T X_A$$$是正定矩阵,且$$$X_A$$$每一步中增加一个列向量,因此我们正好可以采用递进的方式逐步计算每一步中的分解矩阵。假设$$$A_n$$$可以分解为$$$A_n= U_n^T U_n$$$,其中$$$U_n$$$为上三角矩阵。

$$\begin{eqnarray*} A_n &=& U_n^T U_n \\ \begin{bmatrix} A_{n-1} & a_{1n} \\ a_{1n}^T & a_{nn} \end{bmatrix} &=& \begin{bmatrix} U_{n-1}^T & 0 \\ u_{1n}^T & u_{nn} \end{bmatrix} \begin{bmatrix} U_{n-1} & u_{1n} \\ 0 & u_{nn} \end{bmatrix} \\ &=& \begin{bmatrix} U_{n-1}^T U_{n-1} & U_{n-1}^T u_{1n} \\ u_{1n} U_{n-1} & u_{1n}^T u_{n1} + u_{nn}^2 \end{bmatrix} \end{eqnarray*} $$

由于每一步中$$$X_A^TX_A$$$都是正定矩阵,因此$$$A_{n-1}$$$也可以分解成三角矩阵的乘积,所以$$$U_{n-1}$$$可以从上一步得到。接着我们可以利用上面得到的递推公式,在第n-1步时,我们得到了$$$U_{n-1}$$$,且其为三角矩阵,通过解$$$U_{n-1}^T u_{1n} = a_{1n} $$$,我们可以快速地得到$$$u_{1n}$$$,接着就可以计算出$$$u_{nn}$$$,所以每一步的计算量都不大的。初始时,$$$X_A^TX_A$$$就一个元素,直接开方即可得到$$$U_1$$$,之后步骤中使用上述递推公式即可。 ]]> Least Angle Regression 2013-08-21T00:00:00+00:00 hanfeng http://mlnotes.com/2013/08/21/lars 背景知识

最小角回归和模型选择比较像,是一个逐步的过程,每一步都选择一个相关性最大的特征,总的运算步数只和特征的数目有关,和训练集的大小无关。最小角回归训练时的输入为特征矩阵 $$$ X = \{X_1, X_2,..., X_P\} $$$,和期输出向量$$$ Y = \{y_1, y_2,..., y_N \} $$$,$$$X_i$$$ 是长度为$$$N$$$的矩阵,$$$N$$$表示训练集的大小,$$$P$$$则是特征的数目。还有一点需要注意的是,向量$$$X_i$$$ 和 $$$Y$$$ 都是正则化之后的向量,即它们的元素的均值为0,且每个向量的长度都是1,这样做的目的是为了后面计算相关性以及角度的方便。

相关性

相关性一般是用来衡量两个向量之间的相关程度,通常采用相关性公式进行计算,其中A,B为向量:

$$ \begin{eqnarray*} corr &=& \frac{Cov(A,B)}{\sqrt{Var(A)Var(B)}} \\ &=& \frac{E[(A-\bar{A})(B-\bar{B})]}{\sqrt{E[(A-\bar{A})^2]E[(B-\bar{B})^2]}} \end{eqnarray*} $$

corr的绝对值越大,表示A,B的相关性越大,反之则越小。corr的符号则表示这两个向量是正相关还是负相关。由于最小回归的训练数据是经过正则化的,即$$$ \bar{A} = \bar{B} = 0 $$$,$$$|A| = |B| = 1$$$,所以上面的计算公式可以进行简化。

$$ \begin{eqnarray*} corr &=& \frac{E(AB)}{\sqrt{E(A^2)E(B^2)}} \\ &=& \frac{E(AB)}{\sqrt{1*1}} \\ &=& E(AB) \end{eqnarray*} $$

在最小角回归中,$$$E(AB) = \frac{AB}{n} $$$,其中n是向量A或B中元素的个数,因而n是定值,所以为了方便计算,在计算向量的相关性时,我们只需要计算$$$ AB $$$即可。为了计算每个特征和期望输出的相关性,我们需要计算每个$$$X_i$$$ 与 $$$Y$$$的相关性,这种情况下,我们可以采用矩阵和向量的乘法来进行运算,这里X是$$$N \times P$$$的特征矩阵,Y则是大小为N的期望输出向量。

$$ \begin{eqnarray*} Corr &=& X^T Y \end{eqnarray*} $$

这里的$$$Corr$$$是一个大小为P的向量,且 $$$Corr_i$$$表示特征$$$X_i$$$与$$$Y$$$的相关性。

参数选择过程

在最小角回归中,参数选择的准则就是相关性,每次都选择和期望输出相关性最大的特征,即$$$max(|Corr_i|)$$$。不过需要注意的是,在具体计算时,期望输出并不总是Y,而是Y与已选择路径的差向量。

前进路径

在我们的特征矩阵中,共有P个特征向量,每个向量都是N维的,期望输出矩阵Y也是N维的,因此我们可以将这些特征向量以及期望输出向量看作是N维空间中的点,而我们的目的就是在这个空间中找到一条从原点到Y的路径。需要满足的条件就是这条路径可以使用特征矩阵的线性组来合表示,而这些特征矩阵的系数就是线性回归的权重向量。

$$$ \hat{u}_A$$$ 表示从原点出发的一条路径,其初始值为$$$ \vec{0}$$$,我们的目的是在经过若干步之后,使得$$$ \hat{u}_A = Y $$$。每一步中,$$$\hat{u}_A$$$的增量为 $$$\hat{\gamma}u_A$$$,其中$$$u_A$$$ 为单位向量,它指明了 $$$\hat{u}_A$$$ 的前进方向,$$$\hat{\gamma}$$$ 则是前进的距离。

前进方向

在最小角回归的计算过程中,每一步都会选择一个和期望输出$$$ Y - \hat{u_A}$$$(也可以称作残值),最相关的特征$$$X_i$$$,可以用矩阵 $$$ X_A$$$ 表示被选中的特征的集合,$$$ X_A = (...,s_jX_j,...)$$$,$$$s_j$$$ 表示$$$X_j$$$ 与期望输出相关性的符号。选择完变量之后,就是计算前进方向。由于是最小角回归,所以其选择方向的策略就是选择等分$$$X_A$$$中所有向量的角的方向,也就是说$$$u_A$$$和$$$X_A$$$中所有的列向量所成的角相等,那么只需要保证他们之间的$$$cos$$$值相等即可。因为$$$ cos(A,B) = \frac{AB}{|A||B|}$$$,而所有的$$$ |s_jX_j| = 1$$$, 因此为了保证所有的$$$ cos(s_jX_j, u_A) $$$都相等,只需要保证所有的$$$(s_jX_j)u_A $$$ 都相等即可,也就是说要保证$$$ X_A^Tu_A = A_A1_A$$$,其中$$$A_A$$$为实数。我们知道方阵与其逆矩阵的乘积为单位矩阵,我们可以利用这个性质来构造$$$u_A$$$,然而我们无法保证$$$X_A^T$$$是方阵,但我们可以保证$$$X_A^T X_A$$$为方阵,因此我们可以令 $$$u_A = X_A(X_A^T X_A)^{-1}A_A1_A$$$,此时$$$X_A^T u_A = A_A1_A$$$。同时,因为$$$u_A$$$是单位向量,因此 $$$ |u_A| = 1$$$,也就是说 $$$ u_A^T u_A = 1$$$,由此可以得到 $$$ A_A = (1_A^T (X_A^T X_A)^{-1} 1_A)^{0.5}$$$。至此,我们得到以下公式: $$ \begin{eqnarray*} G_A &=& X_A^T X_A \\ A_A &=& (1_A^T G_A^{-1} 1_A)^{\frac{1}{2}} \\ u_A &=& X_A G_A^{-1} A_A 1_A \end{eqnarray*} $$

前进距离

在确定了前进方向之后,我们就可以沿着$$$u_A$$$的方向前进了,但应该前进多少呢?这是我们现在需要解决的问题。一直前进,直到有没被选中的向量与$$$(Y - \hat{u}_A - \hat{\gamma}u_A)$$$ 所成角的绝对值等于选中的向量与 $$$(Y-\hat{u}_A-\hat{\gamma}u_A)$$$ 所成角的绝对值。这里涉及到上面提到的相关性计算以及特征的选择,之前我们说在最小角回归中,每一步都会选择一个变量,在实际操作中,我们并不是在每一步中只选择一个变量,而是选中所有相关性的绝对值等于最大值的特征,不过这个操作和每一步选择一个变量的效果是一样,后面会有解释。在每一步中,我们具体的计算过程如下:

  • 计算特征向量和残值的相关性,并选择最相关的特征向量组成相关特征矩阵$$$X_A$$$ $$ \begin{eqnarray*} Corr &=& X^T(Y - \hat{u_A}) \\ \hat{C} &=& max_j{|Corr_j|} \\ s_j &=& sign(Corr_j) \\ A &=& \{j : |Corr_j| = \hat{C} \} \\ X_A &=& \{s_jX_j : j \in A \} \end{eqnarray*} $$
  • 计算前进方向,上面已经经过,至此,我们得到了$$$u_A$$$
  • 计算前进距离,上面已经讲过前进的终止条件,那么在计算中如何体现呢?即存在$$$X_j$$$其和当前残值所成角的绝对值等于被选中的特征于残值所成的角,为了方便计算,我们可以先计算 $$$ a = X^Tu_A $$$,同时我们令 $$$ A^c = \{1, 2,...,P\} - A$$$。 $$ \begin{eqnarray*} |X_{Ai}^T(Y-\hat{u}_A - \hat{\gamma}u_A)| &=& |X_j^T(Y-\hat{u}_A-\hat{\gamma}u_A)| \\ \hat{C} - \hat{\gamma}A_A &=& |Corr_j - \hat{\gamma}a_j| \\ \hat{\gamma} &=& min^+_{j \in A^c} \left\{\frac{\hat{C}-Corr_j}{A_A-a_j}, \frac{\hat{C}+Corr_j}{A_A+a_j} \right\} \end{eqnarray*} $$ min右上角的+号,表示取最小的正数。

为什么说每步选择一个参数

在最小角回归的文字描述中,我们说每一步都会选择相关性最大的特征加入到$$$X_A$$$中,而在实际计算时,我们却在每一步都重新构建了$$$X_A$$$,那这两种方式得到的矩阵$$$X_A$$$是否相等呢?实际上它们是相等,下面我们就可以来进行验证。

假设在第k步中选中了m个特征$$$X_{A1}, X_{A2},...,X_{Am}$$$被选中,此时我们需要验证就是在第k+1步之后,原来被选中的特征还需要被选中。在第k中,$$$\hat{u}_{Ak}$$$沿着$$$u_{Ak}$$$的方向前进了$$$\hat{\gamma}_k$$$距离,因此在第k+1步中,$$$\hat{u}_{A(k+1)} = \hat{u}_{Ak}+\hat{\gamma}_ku_{Ak}$$$。由于在第k步的前进过程中,$$$X_{Ai}$$$与$$$Y-\hat{u}_{Ak}-\hat{\gamma}u_A$$$所成角的绝对值都相等,其逐渐减小,$$$X_j$$$与残值所成角的绝对值则逐渐增大,一旦$$$X_{Ai}$$$与残值所成角的绝对值等于$$$X_j$$$与残值所成角的绝对值,立即停止前进。因此$$$X_j$$$与残值所成角的绝对值是所有未被选中的特征中与残值所成角的绝对值最大的特征,所以在第k+1步中

$$ \begin{eqnarray*} Corr &=& X^T(Y - \hat{u}_{k+1}) \\ &=& X^T(Y - \hat{u}_k - \hat{\gamma}_k u_{Ak}) \\ \end{eqnarray*} $$

其中绝对值最大的必然是第k步中被选中的特征以及$$$X_j$$$,由此我们知道第k步选中的特征在第k+1步中仍然会被选中,因而这两个方式构建的$$$X_A$$$是等价的,且有如下关系

$$ \begin{eqnarray*} \hat{C}_{k+1} &=& \hat{C}_k - \hat{\gamma}_k A_{Ak} \end{eqnarray*} $$ ]]>
Bias and Variance Tradeoff 2013-08-20T00:00:00+00:00 hanfeng http://mlnotes.com/2013/08/20/bv Bias

Variance

Relationship between Bias and Variance

在机器学习中,我们经常使用最小平方差来评估模型的好坏,一般而言,最小平方差越小则模型越好。而最小平方差实际上是由bias和variance两部分组成的,且这两部分不能被同时缩小。所以为了使得最小平方差最小,我们需要在bias和variance之间做一些tradeoff。

假设我们用来训练的数据集为 $$$D=\{(x_1,t_1),(x_2,t_2),.....,(x_N,t_N)\}$$$,数据的真实关系为 $$$t = f(x) + \epsilon$$$, 且 $$$E(\epsilon)=0$$$, $$$\epsilon$$$可以看做是观测值的噪声,通常是一个均值为0的正太分布。同时假设我们的拟合模型为$$$y = g(x,w)$$$。那么在这个数据集上,我们可以定义最小平方差为 $$$MSE = \frac{1}{N}\sum_i^N\{(t_i - y_i)^2\}$$$,那么最小平方差的均值就为 $$$E(MSE) = \frac{1}{N}\sum_i^N E\{(t_i-y_i)^2\}$$$。接下来我们主要的工作就是对$$$E\{(t_i-y_i)^2\}$$$进行化简,将其转换成bias和variance的形式。

$$ \begin{eqnarray*} E\{(t_i - y_i)^2\} &=& E\{(t_i - f_i + f_i - y_i)^2 \} \\ &=& E\{(t_i-f_i)^2\} + E\{(f_i-y_i)^2\} + 2E\{(t_i-f_i)(f_i-y_i)\} \\ &=& E(\epsilon^2) + E\{(f_i-y_i)^2\} + 2\{E(t_if_i)-E(t_iy_i) - E(f_i^2) + E(f_iy_i)\} \end{eqnarray*} $$

因为$$$f_i$$$是一个常数,因此$$$E(t_if_i) = f_iE(t_i) = f_iE(f_i + \epsilon) = f_i^2$$$ ,同样的,我们有$$$E(f_i^2) = f_i^2$$$ ;又因为$$$t_i = f_i+\epsilon$$$, 有$$$E(t_iy_i) = E(f_iy_i+\epsilon y_i)$$$ ,而$$$y_i$$$ 和 $$$\epsilon$$$是相互独立的,因此$$$E(\epsilon y_i) = 0$$$,得到$$$E(t_iy_i) = E(f_iy_i)$$$,整理之后得到下面的等式。

$$ \begin{eqnarray*} E\{(t_i - y_i)^2\} &=& E(\epsilon^2) + E\{(f_i-y_i)^2\} + 2\{f_i^2-E(f_iy_i) - f_i^2 + E(f_iy_i)\} \\ &=& Var(niose) + E\{(f_i-y_i)^2\} \end{eqnarray*} $$

现在,我们只需要对$$$E\{(f_i-y_i)^2\}$$$进行转化即可。和之前一样,我们仍然采用插入变量的方式,插入一个新的变量$$$E(y_i)$$$,我们可以得到下面的等式。

$$ \begin{eqnarray*} E\{(f_i - y_i)^2\} &=& E\{(f_i-E(y_i) + E(y_i) - y_i)^2\} \\ &=& E\{(f_i-E(y_i))^2\} + E\{(E(y_i) - y_i)^2\} + 2E\{(f_i-E(y_i))(E(y_i)-y_i)\} \\ &=& bias^2 + Var(y_i) + 2\{E(f_iE(y_i))-E(f_iy_i)-E((E(y_i))^2)+E(E(y_i)y_i)\} \end{eqnarray*} $$

很显然,在给定拟合模型以及输入的情况下,$$$E(y_i)$$$是一个常数,此外由于$$$f_i$$$也是一个常数。因而$$$E(f_iE(y_i)) = f_iE(y_i)$$$,$$$E(y_if_i)=f_iE(y_i)$$$,$$$E((E(y_i))^2) = (E(y_i))^2$$$,$$$E(E(y_i)y_i) = (E(y_i))^2$$$,这四个项正好都消除了。我们得到如下等式。

$$ \begin{eqnarray*} E\{(f_i - y_i)^2\} &=& bias^2 + Var(y_i) \end{eqnarray*} $$

因此,最终我们得到

$$ \begin{eqnarray*} E(MSE) &=& \frac{1}{N}\sum_i^N \{Var(noise) + bias^2 + Var(y_i)\} \\ bias^2 &=& E\{(f_i - E(y_i))^2\} \\ Var(y_i) &=& E\{(y_i - E(y_i))^2\} \end{eqnarray*} $$

显然,任何模型都无法消除$$$Var(noise)$$$,因此,为了使得$$$E(MSE)$$$最小,我们必须尽量减小bias和variance,然而这几乎是不可能的。假设我们尽量使得bias最小,那么在最优的情况下,我们可以令模型完美拟合训练数据,也就是说令所有$$$y_i = t_i$$$(因为噪声是未知的,且总是变化的,因为我们无法令$$$y_i = f_i$$$),那么$$$E(y_i) = E(t_i) = f_i$$$,这样,bias部分就是0了,然而此时,variance部分则等于$$$Var(noise)$$$,这是一个非常显著的值;假设我们尽量使得varivance最小,那么就需要令$$$y_i$$$成为一个定值,然后观测值$$$t_i$$$总是变化的,想要$$$y_i$$$是定值,只能忽略输入值,那么必然会造成bias部分变大。所以想要找到最优的bias-variance tradeoff是比较困难的,比较常见的做法是采用交叉验证和正则化。

]]>
Paxos 2013-06-19T00:00:00+00:00 hanfeng http://mlnotes.com/2013/06/19/paxos To Be Done

]]>
Linear Programming 2013-06-16T00:00:00+00:00 hanfeng http://mlnotes.com/2013/06/16/lp In a linear programming problem, we are given a set of variables, and we want to assign real values to them so as to

  1. satisfy a set of linear equations and/or linear inequalities involving these variables
  2. maximize or minimize a given linear objective function

Simplex

Linear Programs can be solved by the simplex method, devised by George Dantzig in 1947. Typically there are three steps:

  1. starts at a vertex
  2. repeatedly looks for an adjacent vertex of better objective value, and moves to it
  3. if no better neighbors, simplex declares this vertex to be the optimal and halts.
]]>