# 實現分解方法
對于這個秘籍,我們將實現一個用于線性回歸的矩陣分解方法。具體來說,我們將使用 Cholesky 分解,TensorFlow 中存在相關函數。
## 做好準備
在大多數情況下,實現前一個秘籍中的逆方法在數值上效率低,尤其是當矩陣變得非常大時。另一種方法是分解`A`矩陣并對分解執行矩陣運算。一種方法是在 TensorFlow 中使用內置的 Cholesky 分解方法。
人們對將矩陣分解為更多矩陣如此感興趣的一個原因是,所得到的矩陣將具有允許我們有效使用某些方法的保證屬性。 Cholesky 分解將矩陣分解為下三角矩陣和上三角矩陣,比如`L`和`L'`,使得這些矩陣是彼此的轉置。有關此分解屬性的更多信息,有許多可用資源來描述它以及如何到達它。在這里,我們將通過將其寫為`LL'x = b`來解決系統`Ax = b`。我們首先解決`Ly = b`的`y`,然后求解`L'x = y`得到我們的系數矩陣`x`。
## 操作步驟
我們按如下方式處理秘籍:
1. 我們將以與上一個秘籍完全相同的方式設置系統。我們將導入庫,初始化圖并創建數據。然后,我們將以之前的方式獲得我們的`A`矩陣和`b`矩陣:
```py
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
from tensorflow.python.framework import ops
ops.reset_default_graph()
sess = tf.Session()
x_vals = np.linspace(0, 10, 100)
y_vals = x_vals + np.random.normal(0, 1, 100)
x_vals_column = np.transpose(np.matrix(x_vals))
ones_column = np.transpose(np.matrix(np.repeat(1, 100)))
A = np.column_stack((x_vals_column, ones_column))
b = np.transpose(np.matrix(y_vals))
A_tensor = tf.constant(A)
b_tensor = tf.constant(b)
```
1. 接下來,我們找到方陣的 Cholesky 分解,`A^T A`:
```py
tA_A = tf.matmul(tf.transpose(A_tensor), A_tensor)
L = tf.cholesky(tA_A)
tA_b = tf.matmul(tf.transpose(A_tensor), b)
sol1 = tf.matrix_solve(L, tA_b)
sol2 = tf.matrix_solve(tf.transpose(L), sol1)
```
> 請注意,TensorFlow 函數`cholesky()`僅返回分解的下對角線部分。這很好,因為上對角矩陣只是下對角矩陣的轉置。
1. 現在我們有了解決方案,我們提取系數:
```py
solution_eval = sess.run(sol2)
slope = solution_eval[0][0]
y_intercept = solution_eval[1][0]
print('slope: ' + str(slope))
print('y_intercept: ' + str(y_intercept))
slope: 0.956117676145
y_intercept: 0.136575513864
best_fit = []
for i in x_vals:
best_fit.append(slope*i+y_intercept)
plt.plot(x_vals, y_vals, 'o', label='Data')
plt.plot(x_vals, best_fit, 'r-', label='Best fit line', linewidth=3)
plt.legend(loc='upper left')
plt.show()
```
繪圖如下:

圖 2:通過 Cholesky 分解獲得的數據點和最佳擬合線
## 工作原理
如您所見,我們得出了與之前秘籍非常相似的答案。請記住,這種分解矩陣然后對碎片執行操作的方式有時會更加高效和數值穩定,尤其是在考慮大型數據矩陣時。
- TensorFlow 入門
- 介紹
- TensorFlow 如何工作
- 聲明變量和張量
- 使用占位符和變量
- 使用矩陣
- 聲明操作符
- 實現激活函數
- 使用數據源
- 其他資源
- TensorFlow 的方式
- 介紹
- 計算圖中的操作
- 對嵌套操作分層
- 使用多個層
- 實現損失函數
- 實現反向傳播
- 使用批量和隨機訓練
- 把所有東西結合在一起
- 評估模型
- 線性回歸
- 介紹
- 使用矩陣逆方法
- 實現分解方法
- 學習 TensorFlow 線性回歸方法
- 理解線性回歸中的損失函數
- 實現 deming 回歸
- 實現套索和嶺回歸
- 實現彈性網絡回歸
- 實現邏輯回歸
- 支持向量機
- 介紹
- 使用線性 SVM
- 簡化為線性回歸
- 在 TensorFlow 中使用內核
- 實現非線性 SVM
- 實現多類 SVM
- 最近鄰方法
- 介紹
- 使用最近鄰
- 使用基于文本的距離
- 使用混合距離函數的計算
- 使用地址匹配的示例
- 使用最近鄰進行圖像識別
- 神經網絡
- 介紹
- 實現操作門
- 使用門和激活函數
- 實現單層神經網絡
- 實現不同的層
- 使用多層神經網絡
- 改進線性模型的預測
- 學習玩井字棋
- 自然語言處理
- 介紹
- 使用詞袋嵌入
- 實現 TF-IDF
- 使用 Skip-Gram 嵌入
- 使用 CBOW 嵌入
- 使用 word2vec 進行預測
- 使用 doc2vec 進行情緒分析
- 卷積神經網絡
- 介紹
- 實現簡單的 CNN
- 實現先進的 CNN
- 重新訓練現有的 CNN 模型
- 應用 StyleNet 和 NeuralStyle 項目
- 實現 DeepDream
- 循環神經網絡
- 介紹
- 為垃圾郵件預測實現 RNN
- 實現 LSTM 模型
- 堆疊多個 LSTM 層
- 創建序列到序列模型
- 訓練 Siamese RNN 相似性度量
- 將 TensorFlow 投入生產
- 介紹
- 實現單元測試
- 使用多個執行程序
- 并行化 TensorFlow
- 將 TensorFlow 投入生產
- 生產環境 TensorFlow 的一個例子
- 使用 TensorFlow 服務
- 更多 TensorFlow
- 介紹
- 可視化 TensorBoard 中的圖
- 使用遺傳算法
- 使用 k 均值聚類
- 求解常微分方程組
- 使用隨機森林
- 使用 TensorFlow 和 Keras