可以使用多項式邏輯回歸學習任何數據嗎
我們知道泰勒多項式可以逼近任何連續函數。正如@DemetriPananos 所注意到的,邏輯回歸旨在估計模型的係數,並且任何截止都是事後施加的。但是假設我們的數據有一個可能的最佳決策邊界。我所說的“最好的”是指一個將兩個類完全分開的決策邊界。
為簡單起見,假設沒有來自正類的數據點覆蓋來自負類的數據點(如@Sycorax 建議的那樣)。例如考慮這個情節:
藍線完美地分隔了兩個類。但藍線本身並不代表功能。
- 如果我們在邏輯回歸中增加多項式的次數,我們能否確定對於任何可以完美分離的數據都可以找到這樣一個完美的決策邊界?
- 如果我的第一個問題的答案是“是”,那麼如何證明(或顯示)它?
對該問題的評論建議以下解釋:
給定任意兩個不重疊的有限點集合 A 和 B 在歐幾里得空間 En, 是否總是存在多項式函數 fA,B:En→R 完美地分離了收藏品?那是, fA,B 在所有點上都有正值 A 和所有點的負值 B.
答案是肯定的,通過建築。
讓 | | 是通常的歐幾里得距離。它的平方是二次多項式。具體來說,使用任何正交坐標系寫 x=(x1,…,xn) 和 y=(y1,…,yn). 我們有
|x−y|2=n∑i=1(xi−yi)2,
它明確地是坐標的二次多項式函數。
定義fA,B(x)=[∑y∈A1|x−y|2−∑y∈B1|x−y|2]∏y∈A∪B|x−y|2.
注意如何 fA,B 被定義為產品。右邊的項清除了左邊分數的分母,表明 f 實際上在任何地方都定義了 En 並且是多項式函數。
乘積左項中的函數有極點(爆炸為 ±∞ ) 精確地在數據點 x∈A∪B. 在點 A 它的價值觀偏離 +∞ 並且在點 B 它的價值觀偏離 −∞. 因為右邊的產品是非負的,我們看到在一個足夠小的鄰域 A fA,B 總是正的並且在足夠小的鄰域中 B fA,B 總是消極的。因此 fA,B 做它的分離工作 A 從 B, QED。
這是顯示輪廓的插圖 fA,B=0 為了 80 平面中隨機選擇的點 E2. 這些, 43 被隨機選擇形成子集 A (繪製為藍色三角形)和其他構成子集 B, 繪製為紅色圓圈。您可以看到此構造有效,因為所有藍色三角形都落在灰色(正)區域內,其中 fA,B>0 所有的紅色圓圈都落在其補碼的內部 fA,B<0.
要查看更多示例,請修改並運行
R
生成該圖的腳本。它的功能f
,在一開始就定義,實現了 fA,B.# # The columns of `A` are all data points. The values of `I` are +/-1, indicating # the subset each column belongs to. # f <- function(x, A, I) { d2 <- colSums((A-x)^2) j <- d2 == 0 # At most one point, assuming all points in `A` are unique if (sum(j) > 0) # Avoids division by zero return(prod(d2[!j]) * prod(I[j])) sum(I / d2) * prod(d2) } # # Create random points and a random binary classification of them. # # set.seed(17) d <- 2 # Dimensions n <- 80 # total number of points p <- 1/2 # Expected Fraction in `A` A <- matrix(runif(d*n), d) I <- sample(c(-1,1), ncol(A), replace=TRUE, prob=c(1-p, p)) # # Check `f` by applying it to the data points and confirming it gives the # correct signs. # I. <- sign(apply(A, 2, f, A=A, I=I)) if (!isTRUE(all.equal(I, I.))) stop("f does not work...") # # For plotting, compute values of `f` along a slice through the space. # slice <- rep(1/2, d-2) # Choose which slice to plot X <- Y <- seq(-0.2, 1.2, length.out=201) Z <- matrix(NA_real_, length(X), length(Y)) for (i in seq_along(X)) for (j in seq_along(Y)) Z[i, j] <- f(c(X[i], Y[j], slice), A, I) # # Display a 2D plot. # image(X, Y, sign(Z), col=c("Gray", "White"), xaxt="n", yaxt="n", asp=1, bty="n", main="Polynomial separator of random points") contour(X, Y, Z, levels=0, labels="", lwd=2, labcex=0.001, add=TRUE) points(t(A), pch=ifelse(I==1, 19, 17), col=ifelse(I==1, "Red", "Blue"))