Efron B, Hastie T, Johnstone I M, et al. Least angle regression[J]. Annals of Statistics, 2004, 32(2): 407-499.

在回归分析中,我们常常需要选取部分特征,而不是全都要,所以有前向法,后退法之类的,再根据一些指标设置停止准则。作者提出了一种LARS的算法,能够在有限步迭代后获得很好的结果,而且这种算法能够和LASSO和stagewise结合,加速他们的算法。在我看来,更为重要的是,其背后的几何解释。

可惜的是,证明实在太多,这方面的只是现在也不想去回顾了,就只能孤陋地把一些简单的东西记一下了。

一些基本的假设



上表,是作者进行比较实验的数据集,注意上面的符号:

令\(X\)表示变量集,以\(x_{ij}\)表示其中的第ij个元素,即第i个病人的第j个指标,用\(x_i\)表示第i个协变量,就是矩阵\(X\)的第i列,用\(y\)来表示应变量,且假设(事实上进行预处理,标准化):



线性回归,其系数假设为\(\beta=(\beta_1, \beta_2, \ldots, \beta_m)'\),给出预测向量\(\mu\),则:

\[\mu = \sum \limits_{j=1}^m x_j \beta_j = X\beta, \quad [X_{n\times m} = (x_1, x_2, \ldots, x_m)]
\]

均方误差为:

\[S(\beta) = \|y-\mu\|^2 = \sum \limits_{i=1}^n (y_i - \mu_i)^2
\]

用\(T(\beta)\)表示\(\beta\)的\(\ell_1\)范数:

\[T(\beta) = \sum \limits_{j=1}^m |\beta_j|.
\]

那么,Lasso通过下式求解:



而Forward Stagewise,以\(\widehat{\mu}=0\)开始,令:



表示当前X与\(y-\widehat{\mu}\)的关系,其中\(X'\)表示\(X\)的转置。

下一步,前进法选择当前关系中最大的部分:



注意到:

\[\widehat{c}_j = x_j'(y - \widehat{\mu}_{old})-\epsilon \cdot sign(\widehat{c}_{\hat{j}})=\widehat{c}_{\hat{j}}-\epsilon \cdot sign(\widehat{c}_{\hat{j}})
\]

所以,如果\(\epsilon=|\widehat{c}_{\hat{j}}|\),那么\(\widehat{c}_j=0\),这个时候,stagewise就成了普通的前进法了,这个方法是过拟合的(不懂啊,照本宣科,所以\(\epsilon\)改怎么选,我也不知道啊)。

文章给了俩种方法的一个比较:

俩个的效果是差不多的,但是,需要注意的是,这俩种方法的迭代次数是不定的。

LARS算法

我们从2个特征开始讨论,\(\bar{y}\)是\(y\)在\(x_1, x_2\)子空间的投影,以\(\hat{\mu}_0=0\)为起点,此时\(\bar{y}_2\)与\(x_1\)的角度更加小(以锐角为准),所以,\(\hat{\mu}_1=\gamma x_1\),相当于我们选取了特征\(x_1\), 也就是说\(\beta_1=\gamma\)。

现在的问题是,\(\gamma\)该怎么选呢,LARS是这么选的,\(\gamma\)使得\(\bar{y}_2-\hat{\mu}_1\)与\(x_1, x_2\)的角度相等,因为这个点俩个特征的重要性是一致的。接着\(\hat{\mu}_2=\hat{\mu}_1+\gamma_2 u_2\),\(\gamma_2u_2=\bar{y}_2-\hat{\mu}_1\)。

这么做,我们将\(y\)在子空间中的投影\(\bar{y}_2\)抵消了。

为了将这种思想推广到更多特征,需要介绍一些符号和公式。



注意,公式(2.6)中的\(G_{\mathcal{A}}^{-1}=\mathcal{G_A^{-1}}\)。

假设\(\widehat{\mu}_{\mathcal{A}}\)是当前的LARS的估计,那么:



指示集\(\mathcal{A}\)是由下式定义的:



令:



注意,这样子,就能令\(s_jx_j'(y-\widehat{\mu}_{\mathcal{A}})=|\widehat{c}_j|, j\in \mathcal{A}\)

用\(X_{\mathcal{A}}, A_{\mathcal{A}}, u_{\mathcal{A}}\)依照上面定义,令:



于是,下一步的更新为:



现在的问题是\(\widehat{\gamma}\)应该怎么选,我们先来考察\(c_j(\gamma)\):



所以,对于\(j \in \mathcal{A}\), \(c_j(\gamma)\)的变换程度是一致的:



\(\gamma \ge 0, A_{\mathcal{A}}\ge0\),(后者是公式所得,前者是为了减少相关度所必须的),所以,当\(\gamma\)从0开始慢慢增大的时候,\(|c_j(\gamma)|\)也会慢慢变小,到一定程度,势必会有\(j \in \mathcal{A}^c\), 使得\(\widehat{C}-\gamma A_{\mathcal{A}} \le |c_j(\gamma)|\),换句话说,我们只要找到\(\widehat{C}-\gamma A_{\mathcal{A}} = |c_j(\gamma)|, j \in \mathcal{A}^c\)的最小\(\gamma\),且\(\gamma > 0\),否则,\(\gamma=0\):

\[\widehat{C}-\gamma A_{\mathcal{A}} = |c_j(\gamma)|, j \in \mathcal{A}^c \\
\Rightarrow \quad \widehat{C}-\gamma A_{\mathcal{A}}=\widehat{c}_j-\gamma a_j | -\widehat{c}_j+\gamma a_j \\
\Rightarrow \gamma = \frac{\widehat{C}-\widehat{c}_j}{A_{\mathcal{A}}-a_j} |\frac{\widehat{C}-\widehat{c}_j}{A_{\mathcal{A}}+a_j}
\]

总结来说,就是:



其中\(+\)表示,如果后半部分的结果均小于0,那么\(\widehat{\gamma}=0\)。

这么做,我们就将\(c_j(\gamma)\)一直降,降到有一个和他们一样,假设这个\(j \in \mathcal{A}^c\)为\(j^*\),于是下一步更新的时候,我们需要将这个加入到\(\mathcal{A}\),\(\mathcal{A}= \mathcal{A} \cup \{j^*\}\)。

假设在LARS的第k步:



用\(X_k, \mathcal{G}_k, A_k\)和\(\mu_k\)是第k步的类似的定义,注意,我们省略了\(\mathcal{A}\)。

用\(\bar{y}_k\)来表示\(y\)在子空间\(\mathcal{L}(X_k)\)的投影,既然\(\widehat{\mu}_{k-1}\in \mathcal{L}(X_{k-1})\)(因为起点为0),所以:



第一个等式后的第二项是\(y-\widehat{\mu}_{k-1}\)在子空间\(\mathcal{L}(X_k)\)中的投影,第二个等式从(2.6)可以推得:

\[u_k = X_k A_k \mathcal{G}_k^{-1}1_k
\]

又根据(2.18)便可得证。根据(2.19)可得:



又\(\widehat{\gamma}_ku_k = \widehat{\mu}_k-\widehat{\mu}_{k-1}\):



这说明,每一次更新时,变化的向量时沿着\(\bar(y)_k-\widehat{\mu}_{k-1}\)的。

我们通过一个图片来展示:



上图,我们要处理的时\(\bar{y}_3\),在以及处理\(\bar{y}_2\)的基础上,我们看到,最后变化的量是在\(\bar{y}_3-\widehat{\mu}_2\)方向上。

算法

顺便整理下算法吧,以便以后用,符号就用自己的了:


Input: 标准化后的\(X = [x_1, x_2, \ldots, x_m]\)和\(y=[y_1, \ldots, y_n]^T\), 特征数\(r\);

令:\(\mu_{\mathcal{A}}=0, \beta=[0, 0, \ldots, 0] \in \mathbb{R}^m\);

计算\(c = X^Ty\), 找出其中绝对值最大的元素,令其指标集为\(\mathcal{A}\),最大值为\(C\),令

\(X_{\mathcal{A}}=[\ldots, s_j x_j, \ldots]_{j \in \mathcal{A}}\), \(\mathcal{G_A}=X_{\mathcal{A}}^TX_{\mathcal{A}}, A_{\mathcal{A}}=(1_\mathcal{A}^T\mathcal{G_A}^{-1}1_{\mathcal{A}})^{-1/2}\), \(\mathrm{u}_{\mathcal{A}}=X_{\mathcal{A}}w_{\mathcal{A}},w_{\mathcal{A}}=A_{\mathcal{A}}\mathcal{G_A}^{-1}1_{\mathcal{A}}\)

For \(k = 1, 2, \ldots, r\):

1. 根据公式(2.13)计算\(\widehat{\gamma}\),记录相应的\(j\),如果\(\widehat{\gamma}=0\),停止迭代。

2. \(\mu_\mathcal{A}=\mu_{\mathcal{A}}+\widehat{\gamma}\mathrm{u}_{\mathcal{A}}\)

3. \(\beta = \beta+\widehat{\gamma}w_{\mathcal{A}}\otimes s_{\mathcal{A}}\)

4. 更新\(\mathcal{A}=\mathcal{A} \cup \{j\}\),\(C=C-\widehat{\gamma}A_{\mathcal{A}}\),\(c=X^T(y-\mu_\mathcal{A})\)

5. 更新\(X_{\mathcal{A}},\mathcal{G_A}, A_{\mathcal{A}}, \mathrm{u}_{\mathcal{A}}\)

输出:\(\beta, \mu_{\mathcal{A}}\)


注意,上面的\(w_\mathcal{A}\otimes s_\mathcal{A}\)表示对于元素相乘, \(s_{\mathcal{A}}\)表示对应的符号。还有,如果\(r=m\),那么上面的迭代只能进行到\(r-1\)步,最后一步可以根据公式(2.19)的分解来,在代码中予以了实现。

不过,利用代码进行实验的时候,发现这俩个好像不大一样

我感觉没有错。

与别的方法结合

LARS与LASSO的关系

通过对\(\gamma\)的调整, 利用LARS也能求解LASSO,证明并没有去看。

可以证明,如果\(\widehat{\beta}\)是通过LASSO求得的解,那么:

令\(d_j = s_jw_{\mathcal{A}j}, j\in \mathcal{A}\),那么对于任意的\(j \in \mathcal{A}\):



因此,\(\beta_j({\gamma})\)改变符号发生在:



第一次改变符号发生在:



如果,所有的\(\gamma_j\)均小于0,那么\(\widetilde{\gamma}=+\infty\)。

也就是说,如果\(\widetilde{\gamma}< \widehat{\gamma}\),为了使得\(\beta\)和\(c\)符号保持一致,我们应当选择前者作为此次的更新步长,同时将\(j\)从\(\mathcal{A}\)中移除。

LARS 与 Stagewise

代码

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. class LARS_LASSO:
  4. def __init__(self, data, response):
  5. self.__data = data
  6. self.__response = response
  7. self.n, self.m = self.data.shape
  8. self.mu = np.zeros(self.n, dtype=float)
  9. self.beta = np.zeros(self.m, dtype=float)
  10. self.compute_c()
  11. self.compute_index()
  12. self.compute_basic()
  13. self.progress_beta = []
  14. self.progress_mu = []
  15. @property
  16. def data(self):
  17. return self.__data
  18. @property
  19. def response(self):
  20. return self.__response
  21. def compute_c(self):
  22. """计算关系度c"""
  23. self.c = self.data.T @ (self.response-self.mu)
  24. def compute_index(self):
  25. """找出最大值C和指标集A,以及sj"""
  26. self.index = [np.argmax(np.abs(self.c))]
  27. newc = self.c[self.index]
  28. self.maxC = np.abs(newc[0])
  29. sign = lambda x: 1. if x >= 0 else -1.
  30. self.s = np.array(
  31. [sign(item) for item in newc],
  32. dtype=float
  33. )
  34. def compute_basic(self):
  35. """计算一些基本的东西
  36. index_A: A_A
  37. index_w: w_A
  38. index_u: u_A
  39. """
  40. index_X = self.data[:, self.index] * self.s
  41. index_G = index_X.T @ index_X
  42. index_G_inv = np.linalg.inv(index_G)
  43. self.index_A = 1 / np.sqrt(np.sum(index_G_inv))
  44. self.index_w = np.sum(index_G_inv, 1) * self.index_A
  45. self.index_u = index_X @ self.index_w
  46. def update_c(self):
  47. """更新c"""
  48. self.compute_c()
  49. def update_index(self, j):
  50. """更新指示集合
  51. index: 指示集合A
  52. maxC: 最大的c
  53. s: 符号
  54. """
  55. if j in self.index:
  56. self.index.remove(j)
  57. else:
  58. self.index.append(j)
  59. self.index.sort()
  60. newc = self.c[self.index]
  61. self.maxC = np.abs(newc[0])
  62. sign = lambda x: 1. if x >= 0 else -1.
  63. self.s = np.array(
  64. [sign(item) for item in newc],
  65. dtype=float
  66. )
  67. def update_basic(self):
  68. """更新基本的东西"""
  69. self.compute_basic()
  70. def current_gamma(self):
  71. """找第一次改变符号的位置"""
  72. const = 999999999.
  73. d = self.s * self.index_w
  74. index_beta = self.beta[self.index]
  75. z = []
  76. for i in range(len(d)):
  77. if -index_beta[i] * d[i] <= 0:
  78. z.append(const)
  79. else:
  80. z.append(-index_beta[i] / d[i])
  81. z = np.array(z, dtype=float)
  82. label = np.argmin(z)
  83. themin = z[label]
  84. return themin, self.index[label]
  85. def step(self):
  86. """操作一步"""
  87. const = 9999999999.
  88. def divide(x, y):
  89. z = []
  90. for i in range(len(x)):
  91. if x[i] * y[i] <= 0:
  92. z.append(const)
  93. else:
  94. z.append(x[i] / y[i])
  95. return z
  96. complement_index = list(set(range(self.m))
  97. - set(self.index))
  98. a = self.data.T @ self.index_u
  99. complement_a = a[complement_index]
  100. complement_c = self.c[complement_index]
  101. index_reduce_a = self.index_A - complement_a
  102. index_plus_a = self.index_A + complement_a
  103. maxC_reduce_c = self.maxC - complement_c
  104. maxc_plus_c = self.maxC + complement_c
  105. min1 = divide(maxC_reduce_c, index_reduce_a)
  106. min2 = divide(maxc_plus_c, index_plus_a)
  107. totalmin = np.array(
  108. [min1, min2]
  109. )
  110. allmin = np.min(totalmin, 0)
  111. min_beta, label2 = self.current_gamma()
  112. self.progress_beta.append(np.array(self.beta))
  113. self.progress_mu.append(np.array(self.mu))
  114. try:
  115. label = np.argmin(allmin)
  116. except ValueError:
  117. index_X = self.data[:, self.index] * self.s
  118. index_G = index_X.T @ index_X
  119. index_G_inv = np.linalg.inv(index_G)
  120. deltau = index_G_inv @ index_X.T @ (self.response - self.mu)
  121. self.mu = self.mu + index_X @ deltau
  122. self.beta = self.beta + deltau * self.s
  123. return 0
  124. print(min_beta, allmin[label])
  125. if min_beta < allmin[label]:
  126. gamma = min_beta
  127. j = label2
  128. else:
  129. gamma = 0. if allmin[label] == const else allmin[label]
  130. j = complement_index[label]
  131. self.mu = self.mu + gamma * self.index_u
  132. self.beta[self.index] = self.beta[self.index] + (self.s * self.index_w) * gamma
  133. if self.life == 0:
  134. return 1
  135. self.update_c()
  136. self.update_index(j)
  137. self.update_basic()
  138. return 1
  139. def process(self, r=1):
  140. self.life = r
  141. for i in range(r):
  142. self.life -= 1
  143. print("step:", i)
  144. self.step()
  145. self.progress_beta.append(np.array(self.beta))
  146. self.progress_mu.append(np.array(self.mu))
  147. index_X = self.data[:, self.index] * self.s
  148. index_G = index_X.T @ index_X
  149. index_G_inv = np.linalg.inv(index_G)
  150. deltau = index_G_inv @ index_X.T @ (self.response - self.mu)
  151. self.mu = self.mu + index_X @ deltau
  152. self.beta[self.index] = self.beta[self.index] + deltau * self.s
  153. self.progress_beta.append(np.array(self.beta))
  154. self.progress_mu.append(np.array(self.mu))
  155. def plot(self):
  156. """plot beta, error"""
  157. fig, ax = plt.subplots(nrows=1, ncols=2,
  158. figsize=(10, 5), constrained_layout=True)
  159. beta = np.array(self.progress_beta)
  160. mu = np.array(self.progress_mu)
  161. r, m = beta.shape
  162. error = np.sum((mu - self.response) ** 2, 1)
  163. x = np.arange(1, r+1)
  164. for i in range(m):
  165. y = beta[:, i]
  166. ax[0].plot(x, y, label="feature{0}".format(i))
  167. ax[0].text(x[-1]+0.05, y[-1], str(i))
  168. ax[0].set_title(r"$\beta$ with iterations")
  169. ax[0].set_xlabel(r"iterations")
  170. ax[0].set_ylabel(r"$\beta$")
  171. ax[0].legend(loc="best", ncol=2)
  172. ax[1].plot(x, error)
  173. ax[1].set_title("square error with iterations")
  174. ax[1].set_xlabel("iterations")
  175. ax[1].set_ylabel("square error")
  176. plt.show()
  177. data1 = np.loadtxt("C:\\Users\\pkavs\\Desktop\\diabetes.txt", dtype=float)
  178. mu = np.mean(data1, 0)
  179. std = np.std(data1, 0)
  180. data1 = (data1 - mu) / std
  181. data = data1[:, :10]
  182. response = data1[:, 10]
  183. test = LARS_LASSO(data, response)
  184. test.process(r=7)
  185. test.plot()
  186. print(test.progress_beta)

  1. """
  2. 跟论文有出路,实验的时候并没有删除的过程,好像是要在
  3. 全部特征的基础上,再进行一步,不过机制不想改了,就这样吧
  4. """
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. class LARS_LASSO:
  8. def __init__(self, data, response):
  9. self.__data = data
  10. self.__response = response
  11. self.n, self.m = self.data.shape
  12. self.mu = np.zeros(self.n, dtype=float)
  13. self.beta = np.zeros(self.m, dtype=float)
  14. self.compute_c()
  15. self.compute_index()
  16. self.compute_basic()
  17. self.progress_beta = []
  18. self.progress_mu = []
  19. @property
  20. def data(self):
  21. return self.__data
  22. @property
  23. def response(self):
  24. return self.__response
  25. def compute_c(self):
  26. """计算关系度c"""
  27. self.c = self.data.T @ (self.response-self.mu)
  28. def compute_index(self):
  29. """找出最大值C和指标集A,以及sj"""
  30. self.index = [np.argmax(np.abs(self.c))]
  31. newc = self.c[self.index]
  32. self.maxC = np.abs(newc[0])
  33. sign = lambda x: 1. if x >= 0 else -1.
  34. self.s = np.array(
  35. [sign(item) for item in newc],
  36. dtype=float
  37. )
  38. def compute_basic(self):
  39. """计算一些基本的东西
  40. index_A: A_A
  41. index_w: w_A
  42. index_u: u_A
  43. """
  44. index_X = self.data[:, self.index] * self.s
  45. index_G = index_X.T @ index_X
  46. index_G_inv = np.linalg.inv(index_G)
  47. self.index_A = 1 / np.sqrt(np.sum(index_G_inv))
  48. self.index_w = np.sum(index_G_inv, 1) * self.index_A
  49. self.index_u = index_X @ self.index_w
  50. def update_c(self):
  51. """更新c"""
  52. self.compute_c()
  53. def update_index(self, j):
  54. """更新指示集合
  55. index: 指示集合A
  56. maxC: 最大的c
  57. s: 符号
  58. """
  59. if j in self.index:
  60. self.index.remove(j)
  61. else:
  62. self.index.append(j)
  63. self.index.sort()
  64. newc = self.c[self.index]
  65. self.maxC = np.abs(newc[0])
  66. sign = lambda x: 1. if x >= 0 else -1.
  67. self.s = np.array(
  68. [sign(item) for item in newc],
  69. dtype=float
  70. )
  71. def update_basic(self):
  72. """更新基本的东西"""
  73. self.compute_basic()
  74. def current_gamma(self):
  75. """找第一次改变符号的位置"""
  76. const = 999999999.
  77. d = self.s * self.index_w
  78. index_beta = self.beta[self.index]
  79. z = []
  80. for i in range(len(d)):
  81. if -index_beta[i] * d[i] <= 0:
  82. z.append(const)
  83. else:
  84. z.append(-index_beta[i] / d[i])
  85. z = np.array(z, dtype=float)
  86. label = np.argmin(z)
  87. themin = z[label]
  88. return themin, self.index[label]
  89. def step(self):
  90. """操作一步"""
  91. const = 9999999999.
  92. def divide(x, y):
  93. z = []
  94. for i in range(len(x)):
  95. if x[i] * y[i] <= 0:
  96. z.append(const)
  97. else:
  98. z.append(x[i] / y[i])
  99. return z
  100. complement_index = list(set(range(self.m))
  101. - set(self.index))
  102. a = self.data.T @ self.index_u
  103. complement_a = a[complement_index]
  104. complement_c = self.c[complement_index]
  105. index_reduce_a = self.index_A - complement_a
  106. index_plus_a = self.index_A + complement_a
  107. maxC_reduce_c = self.maxC - complement_c
  108. maxc_plus_c = self.maxC + complement_c
  109. min1 = divide(maxC_reduce_c, index_reduce_a)
  110. min2 = divide(maxc_plus_c, index_plus_a)
  111. totalmin = np.array(
  112. [min1, min2]
  113. )
  114. allmin = np.min(totalmin, 0)
  115. min_beta, label2 = self.current_gamma()
  116. print(len(self.progress_beta))
  117. self.progress_beta.append(np.array(self.beta))
  118. self.progress_mu.append(np.array(self.mu))
  119. try:
  120. label = np.argmin(allmin)
  121. except ValueError:
  122. index_X = self.data[:, self.index] * self.s
  123. index_G = index_X.T @ index_X
  124. index_G_inv = np.linalg.inv(index_G)
  125. deltau = index_G_inv @ index_X.T @ (self.response - self.mu)
  126. self.mu = self.mu + index_X @ deltau
  127. self.beta = self.beta + deltau * self.s
  128. return 0
  129. if min_beta < allmin[label]:
  130. gamma = min_beta
  131. label = label2
  132. else:
  133. gamma = 0. if allmin[label] == const else allmin[label]
  134. self.mu = self.mu + gamma * self.index_u
  135. self.beta[self.index] = self.beta[self.index] + (self.s * self.index_w) * gamma
  136. if self.life == 0:
  137. return 1
  138. j = complement_index[label]
  139. self.update_c()
  140. self.update_index(j)
  141. self.update_basic()
  142. return 1
  143. def process(self, r=1):
  144. self.life = r
  145. for i in range(r):
  146. self.life -= 1
  147. print("step:", i)
  148. self.step()
  149. self.progress_beta.append(np.array(self.beta))
  150. self.progress_mu.append(np.array(self.mu))
  151. index_X = self.data[:, self.index] * self.s
  152. index_G = index_X.T @ index_X
  153. index_G_inv = np.linalg.inv(index_G)
  154. deltau = index_G_inv @ index_X.T @ (self.response - self.mu)
  155. self.mu = self.mu + index_X @ deltau
  156. self.beta[self.index] = self.beta[self.index] + deltau * self.s
  157. self.progress_beta.append(np.array(self.beta))
  158. self.progress_mu.append(np.array(self.mu))
  159. def plot(self):
  160. """plot beta, error"""
  161. fig, ax = plt.subplots(nrows=1, ncols=2,
  162. figsize=(10, 5), constrained_layout=True)
  163. beta = np.array(self.progress_beta)
  164. mu = np.array(self.progress_mu)
  165. r, m = beta.shape
  166. error = np.sum((mu - self.response) ** 2, 1)
  167. x = np.arange(1, r+1)
  168. for i in range(m):
  169. y = beta[:, i]
  170. ax[0].plot(x, y, label="feature{0}".format(i))
  171. ax[0].text(x[-1]+0.05, y[-1], str(i))
  172. ax[0].set_title(r"$\beta$ with iterations")
  173. ax[0].set_xlabel(r"iterations")
  174. ax[0].set_ylabel(r"$\beta$")
  175. ax[0].legend(loc="best", ncol=2)
  176. ax[1].plot(x, error)
  177. ax[1].set_title("square error with iterations")
  178. ax[1].set_xlabel("iterations")
  179. ax[1].set_ylabel("square error")
  180. plt.show()

Least Angle Regression的更多相关文章

  1. 机器学习方法:回归(三):最小角回归Least Angle Regression(LARS),forward stagewise selection

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 希望与志同道合的朋友一起交流,我刚刚设立了了一个技术交流QQ群:433250724,欢迎对算法.技术.应用感 ...

  2. [Scikit-learn] 1.1 Generalized Linear Models - Lasso Regression

    Ref: http://blog.csdn.net/daunxx/article/details/51596877 Ref: https://www.youtube.com/watch?v=ipb2M ...

  3. 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. "机器学习方法"系列,我本着开放与共享(open and share)的精神撰写,目的是 ...

  4. [Scikit-learn] 1.1 Generalized Linear Models - from Linear Regression to L1&L2

    Introduction 一.Scikit-learning 广义线性模型 From: http://sklearn.lzjqsdd.com/modules/linear_model.html#ord ...

  5. 【翻译】Awesome R资源大全中文版来了,全球最火的R工具包一网打尽,超过300+工具,还在等什么?

    0.前言 虽然很早就知道R被微软收购,也很早知道R在统计分析处理方面很强大,开始一直没有行动过...直到 直到12月初在微软技术大会,看到我软的工程师演示R的使用,我就震惊了,然后最近在网上到处了解和 ...

  6. Lasso回归算法: 坐标轴下降法与最小角回归法小结

    前面的文章对线性回归做了一个小结,文章在这: 线性回归原理小结.里面对线程回归的正则化也做了一个初步的介绍.提到了线程回归的L2正则化-Ridge回归,以及线程回归的L1正则化-Lasso回归.但是对 ...

  7. [Python] 机器学习库资料汇总

    声明:以下内容转载自平行宇宙. Python在科学计算领域,有两个重要的扩展模块:Numpy和Scipy.其中Numpy是一个用python实现的科学计算包.包括: 一个强大的N维数组对象Array: ...

  8. python数据挖掘领域工具包

    原文:http://qxde01.blog.163.com/blog/static/67335744201368101922991/ Python在科学计算领域,有两个重要的扩展模块:Numpy和Sc ...

  9. 0003--Weekly Meeting on 10th April and 17th April, 2015

    10th April, 2015 (1) Orthogonal Matching Pursuit, Least Angle Regression, Dictionary Coherence. -> ...

随机推荐

  1. SQLite is 35% Faster Than The Filesystem

    比方说你要在C++/PHP里实现一个函数Image get_image(string id),不同的图片有1万张(用户头像),你可以把它们存在一个目录/文件夹里,然后fopen()再fread. 你也 ...

  2. flink-----实时项目---day06-------1. 获取窗口迟到的数据 2.双流join(inner join和left join(有点小问题)) 3 订单Join案例(订单数据接入到kafka,订单数据的join实现,订单数据和迟到数据join的实现)

    1. 获取窗口迟到的数据 主要流程就是给迟到的数据打上标签,然后使用相应窗口流的实例调用sideOutputLateData(lateDataTag),从而获得窗口迟到的数据,进而进行相关的计算,具体 ...

  3. 【STM32】WS2812介绍、使用SPI+DMA发送数据

    这篇要使用到SPI+DMA,需要了解的话,可以参考我另两篇博客 时钟:https://www.cnblogs.com/PureHeart/p/11330967.html SPI+DMA通信:https ...

  4. Nginx流量拷贝

    1. 需求 将生产环境的流量拷贝到预上线环境或测试环境,这样做有很多好处,比如: 可以验证功能是否正常,以及服务的性能: 用真实有效的流量请求去验证,又不用造数据,不影响线上正常访问: 这跟灰度发布还 ...

  5. ORACLE 本session产生的redo

    select * from v$statname a ,v$mystat bwhere a.STATISTIC# = b.STATISTIC# and a.name = 'redo size';

  6. Java中的循环结构进阶

    循环结构进阶 学习本章用到的单词 triangle:三角形 circle:圆形 diamond:钻石 password:密码 row:行.排列 二重循环结构 简单的说:二重循环就是一个循环体内又包含另 ...

  7. 如何为Dash/Zeal生成c++ 文档: 以abseil文档为例

    目录 1. 软件安装 2 Sample源文件下载: 3. 生成步骤 3.1 使用doxygen生成html文件 3.2 使用docsetutil 生成 dash/Zeal 格式 1. 软件安装: 1. ...

  8. Mysql资料 存储索引

  9. MySQL 创建定时任务 详解

    自 MySQL5.1.6起,增加了一个非常有特色的功能–事件调度器(Event Scheduler),可以用做定时执行某些特定任务,来取代原先只能由操作系统的计划任务来执行的工作.事件调度器有时也可称 ...

  10. MemoryCache 如何清除全部缓存?

    最近有个需求需要定时清理服务器上所有的缓存.本来以为很简单的调用一下 MemoryCache.Clear 方法就完事了.谁知道 MemoryCache 类以及 IMemoryCache 扩展方法都没有 ...