回歸演算法程序
A. 請教多元線性回歸C++演算法或程序
多元線性回歸C++程序:
Dim a() As String, b() As String
Private Sub Command1_Click()
Dim temp1 As String
Dim i As Integer, k As Integer
temp1 = Text1.Text
a = Split(temp1, ",")
lenolds = Len("->")
For i = 0 To UBound(a)
s = a(i)
j = InStr(s, "->")
Do While j > 0
ReDim Preserve b(i, k)
b(i, k) = Val(Left(s, j + lenolds))
s = Left(s, j - 1) + "->" + Mid(s, j + lenolds + 1)
k = k + 1
j = InStr(s, "->")
Loop
ReDim Preserve b(i, k)
b(i, k) = s
Next i
For i = 0 To UBound(a)
For j = 0 To k
Text2.Text = Text2.Text + b(i, j)
Next j
Next i
End Sub
B. 用java實現二元線性回歸演算法運用到了什麼知識
import java.lang.Math;
import java.util.Random;
/**
* 冒泡排序
* 該程序先隨機生成一個長度為10,並且數值在10-210之間的數組
* 然後通過冒泡的方法對生成的數組進行排序並侍遲蔽從控制台輸出。
*
*/
public class SortTest {
/**
* 升序標志
*/
public static final int SHENGXU=1;
/**
* 降序標志
*/
public static final int JIANGXU=2;
/**
* 主函數
* @param args
*/
public static void main(String args[]) {
SortTest.execSort(JIANGXU);
}
/**
* 交換值,交換數組的兩個值
* @param array 操作的數組
* @param i 第一個
* @param j 第二個
*/
private static void jiaohuan(int[] array,int i, int j)
{
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
/**
*
* @param method
* 1為升序,2為降序
*/
public static void execSort(int method) {
int[] array = null;
array = initArray(10, 210, 10);
int[] orderarray = maopao(array,method);
for (int i = 0; i < orderarray.length; i++) {
System.out.println(orderarray[i]);
}
}
/**
* 取隨機數據,初始化一個數組
*
* @param min
* 隨機數的最小值
* @param max
* 最大值
* @param size
* 取老州得隨機數的數量
* @return
*/
public static int[] initArray(int min, int max, int size) {
int[] init = new int[size];
for (int i = 0; i < size; i++) {
init[i] = min + (int) (Math.random() * (max - min + 1));
System.out.println(i + "-------" + init[i]);
}
return init;
}
/旦岩**冒泡排序方法
* 原理:從最後一個開始將小的或大的逐漸冒出
* @param array
* @param method
* @return
*/
public static int[] maopao(int[] array,int method)
{
for(int i=0;i<array.length;i++)
{
for (int j=array.length -1 ;j>i;j--)
{
if (method==2)
{
if (array[i] < array[j])
jiaohuan(array,i,j);
}else if (method==1)
if (array[i] > array[j])
jiaohuan(array,i,j);
}
}
return array;
}
}
C. C語言 多元線性回歸演算法
從鍵盤輸入abcd,
float x,y,z,M;
M=a*x+b*y+c*x+d
輸出M
你要的是這個意思嗎?
D. GBDT與XGBoost
之前介紹過 梯度下降法與牛頓法 ,GBDT與XGBoost就與這兩種方法有關。
GBDT泛指所有梯度提升樹演算法,包括XGBoost,它也是GBDT的一種變種,為了區分它們,GBDT一般特指「Greedy Function Approximation:A Gradient Boosting Machine」里提出的演算法,只用了一階導數信息。
演算法流程如下:
演算法流程圖也可以如下圖:
GBDT常用損失函數
分類演算法:
分類演算法中CART樹也是採用回歸樹
(1) 指數損失函數:
負梯度計算和葉子節點的最佳負梯度擬合與Adaboost相似。
(2) 對數損失函數:
二元分類:
多元分類:
回歸演算法:
(1)均方差:
(2)絕對損失:
負梯度誤差為:
(3)Huber損失:
均方差和絕對損失的折中,對遠離中心的異常點,採用絕對損失,而中心附近的點採用均方差。界限一般用分位數點度量。損失函數如下:
負梯度誤差:
(4) 分位數損失:分位數回歸的損失函數,表達式為
θ為分位數,需要我們在回歸前指定。對應的負梯度誤差為:
Huber損失和分位數損失,減少異常點對損失函數的影響。
問題:GBDT如何減少異常點的影響?
GBDT優點:
GBDT缺點:
Adaboost與GBDT:
RF與GBDT:
RF優點:
RF缺點:
XGBoost目標函數及歸一化公式
歸一化解釋
XGBoost參數定義
XGBoost第t次迭代: 訓練第t棵子樹,損失函數最小求參數,計算過程如下
假設分到j這個葉子節點上的樣本只有一個。那麼,w* j 如下:
回歸樹的學習策略
XGBoost的打分函數
樹節點分裂方法
尋找分為點可以使用Weighted Quantile Sketch—分布式加權直方圖演算法
稀疏值處理
關鍵的改進是只訪問非缺失的條目I k 。 所提出的演算法將不存在的值視為缺失值並且學習處理缺失值的最佳方向。稀疏感知演算法運行速度比初始版本快50倍
XGBoost的其它特性
Shrinkage and Column Subsampling
Shrinkage and Column Subsampling均是為了防止過擬合
XGBoost的系統設計
Column Block
xgboost的並行不是tree粒度的並行,而是特徵粒度上。
緩存感知訪問(Cache-aware Access)
XGBoost的優點
XGBoost與GBDT對比
問題:XGBoost為什麼使用CART樹而不是用普通的決策樹呢?
XGBoost參數說明
回歸樹 生成演算法如下,使用最小二乘偏差(LSD)。
分類樹 演算法流程如下,使用GINI指數
GINI 指數:
分類中,假設 K 個類,樣本屬於第 k 類的概率為 p k ,概率分布的基尼指數為:
樣本集合 D 的基尼指數為:
C k 為數據集D中屬於第k類的樣本子集,| * |表示樣本集中樣本的個數。
數據集 D 根據特徵 A 在某一取值 a 上進行分割,得到 D 1 、D 2 兩部分,則在特徵 A 下集合 D 的基尼指數為:
停止條件:
剪枝
決策樹防止過擬合方法:
代價復雜度剪枝 Cost-Complexity Pruning(CCP) 方法對CART剪枝,演算法流程如下:
其中 C(T)為誤差(例如基尼指數),|T| 為 T 的葉節點個數,alpha 為非負參數,用來權衡訓練數據的擬合程度和模型的復雜度。
剪枝例子如下:
例如 t 1 節點,R(t)即剪枝後誤差,數據所佔比例16/16,節點誤差率 = 該節點較少類別的數/該節點類別總數 = 8/16
R(Tt)為剪枝前誤差,即葉子節點誤差之和,以該節點為根節點的4葉子節點均只有一個類別的樣本,該節點較少類別的數/該節點類別總數 = 0,所以R(Tt) = 0
參考