RBF Network
前面的一篇SVM中田轧,最后的分割函數(shù):
Gaussian函數(shù)還有另外一個(gè)叫法——徑向基函數(shù),這是因?yàn)檫@個(gè)base function的結(jié)果只和計(jì)算這個(gè)x和中心點(diǎn)xn的距離有關(guān)狠鸳,與其他的無(wú)關(guān)。
從其他方面來(lái)看SVM悯嗓,先構(gòu)造一個(gè)函數(shù):
指數(shù)求出來(lái)的其實(shí)就是x點(diǎn)和中心點(diǎn)的相似度件舵,相似度越高,那么=晚y這個(gè)方向投票的票數(shù)就會(huì)越多脯厨。不同的g(x)有不同的權(quán)重铅祸,他們的線性組合就成了SVM,g(x)函數(shù)稱為是radial function合武。所以Gaussian SVM就是把一些radial function聯(lián)合起來(lái)做linear aggregation临梗。
RBF Network就是SVM的延伸,目的就是找到所有radial hypotheses的linear aggregation稼跳,得到更好的網(wǎng)絡(luò)模型盟庞。
可以看到這兩種網(wǎng)絡(luò)其實(shí)很類似,Neural Network的隱藏層是權(quán)值和數(shù)據(jù)做內(nèi)積非線性轉(zhuǎn)換再uniform的組合得到最后的輸出汤善,而對(duì)于RBF Network隱藏層是求高斯距離在做aggregation的方法什猖。比較大的不同點(diǎn)就在于hidden層的不同了。
β就是每一個(gè)radial function的權(quán)值红淡,μ就是中心點(diǎn)坑律,m為中心點(diǎn)的個(gè)數(shù)滞造,主要的潭袱,對(duì)比一下之前的SVM磨确,β就是αy,μ就是支持向量颈渊。由于是一個(gè)分類問(wèn)題遂黍,所以最后的output function就是sign函數(shù)了终佛。
之前講過(guò)俊嗽,一個(gè)核函數(shù)不是隨便亂選的雾家,要滿足兩個(gè)條件:對(duì)稱,半正定绍豁。對(duì)于SVM里面的核函數(shù)芯咧,其實(shí)ius把當(dāng)前的數(shù)據(jù)提升到某一個(gè)很高很高的維度,然后做切片把數(shù)據(jù)分出來(lái)竹揍,polynomial function也是一樣的敬飒,只不過(guò)是有限維度的。而RBF其實(shí)就是在當(dāng)前的空間做相似度處理芬位,而那些kernel其實(shí)就是轉(zhuǎn)換到z空間來(lái)計(jì)算核函數(shù)以表征兩個(gè)向量的相似度无拗。所以RBF和kernel都是衡量相似度的方式。雖然SVM和RBF Network都很相似昧碉,甚至可以說(shuō)最后的決策函數(shù)基本一致的英染,但是他們的學(xué)習(xí)過(guò)程是很不一樣的,一個(gè)是直接x空間被饿,一個(gè)是轉(zhuǎn)換到z空間四康。
衡量相似性并不止一種RBF方法,余弦相似度這些也可以衡量向量之間的相似度狭握。
回過(guò)頭來(lái)思考一下SVM闪金,其實(shí)支持向量機(jī)就是先通過(guò)凸優(yōu)化的一些方法找到有投票權(quán)利的點(diǎn),之后給出相應(yīng)的權(quán)值论颅,最后決策就是這些有投票權(quán)利的點(diǎn)進(jìn)行決策哎垦;對(duì)于其他線性模型,其實(shí)主要的不同就是他們每一個(gè)點(diǎn)都有投票的權(quán)利恃疯,這就導(dǎo)致很遠(yuǎn)的點(diǎn)都會(huì)干擾到邊界撼泛。而RBF Network事實(shí)上做的事情和SVM有點(diǎn)像,因?yàn)镽BF函數(shù)是指數(shù)增長(zhǎng)澡谭,如果這個(gè)點(diǎn)很遠(yuǎn)的話會(huì)非常小愿题,近乎就是0了,所以也起到了弱化遠(yuǎn)的點(diǎn)投票權(quán)蛙奖,強(qiáng)化近的點(diǎn)投票權(quán)的能力潘酗。
RBF Network Learning
RBF Network的決策函數(shù):
μ就是中心點(diǎn),中心點(diǎn)是自己選擇的雁仲。有一種選擇中心點(diǎn)的方法仔夺,就是所有的點(diǎn)都作為中心點(diǎn),那么每一個(gè)樣本對(duì)于預(yù)測(cè)都會(huì)有影響攒砖,β就是影響的程度缸兔。如果影響的程度都是一樣的日裙,那么就是1了,β = 1*y惰蜜,最后相乘做uniform aggregation之后sign得到結(jié)果昂拂。這種我們稱為full RBF Network。
這個(gè)時(shí)候抛猖,full RBF Network就可以表示為:
這是一個(gè)指數(shù)函數(shù)格侯,距離越遠(yuǎn),那么衰減的就越快财著,x與中心點(diǎn)的距離越近那么就越大联四,距離越遠(yuǎn)就越小。也就是說(shuō)撑教,如果我們的樣本點(diǎn)是N個(gè)朝墩,那么起了關(guān)鍵作用的一般就是最近的那個(gè)點(diǎn)而已,當(dāng)然伟姐,不一定是最近的一個(gè)點(diǎn)收苏,可以是最近的K個(gè)點(diǎn),用這k個(gè)點(diǎn)來(lái)代替N個(gè)點(diǎn)玫镐,當(dāng)前的點(diǎn)周圍最近的k個(gè)點(diǎn)哪個(gè)類別最多倒戏,那么這個(gè)當(dāng)前這個(gè)點(diǎn)就是屬于哪個(gè)類別的。這種算法就叫K近鄰算法恐似。
k nearest neighbor通常比nearest neighbor model效果更好杜跷,計(jì)算量上也比f(wàn)ull RBF Network要簡(jiǎn)單一些。值得一提的是矫夷,k nearest neighbor與full RBF Network都是比較“偷懶”的方法葛闷。因?yàn)樗鼈冊(cè)谟?xùn)練模型的時(shí)候比較簡(jiǎn)單,沒(méi)有太多的運(yùn)算双藕,但是在測(cè)試的時(shí)候卻要花費(fèi)更多的力氣淑趾,甚至可以說(shuō)是幾乎沒(méi)有運(yùn)算在里面,只需要做一些簡(jiǎn)單的數(shù)據(jù)處理即可忧陪,找出最相近的中心點(diǎn)扣泊,計(jì)算相對(duì)復(fù)雜一些。
如果是做回歸問(wèn)題嘶摊,我們就只需要去掉output:
很明顯延蟹,這樣就是一個(gè)線性回歸的問(wèn)題了,每一個(gè)RBF 其實(shí)可以看做就是一個(gè)矩陣比如第一個(gè)元素x1叶堆,那么經(jīng)過(guò)RBF的轉(zhuǎn)換之后:
那么Z就是z的按列排序了阱飘,按照線性回歸的解公式:
上述矩陣Z是一個(gè)方陣,大小是N,有多少個(gè)中心點(diǎn)那么就有多少個(gè)N沥匈。如果每一個(gè)x都是不一樣的蔗喂,那么這個(gè)矩陣就是可以逆的矩陣了,畢竟x是訓(xùn)練數(shù)據(jù)高帖,一樣的就沒(méi)有意義了缰儿。
化簡(jiǎn)一下:
我們以x1為例子,那么解就是:
這個(gè)結(jié)果對(duì)于我們來(lái)說(shuō)非常奇怪棋恼,如果這樣的話那么對(duì)于所有的x都有:
所有Ein = 0返弹,這樣對(duì)于機(jī)器學(xué)習(xí)來(lái)說(shuō)并不是一個(gè)好事情锈玉,因?yàn)檫@樣很大概率會(huì)出現(xiàn)過(guò)擬合爪飘。當(dāng)然,某些情況下還是很有用的拉背,比如函數(shù)擬合或者是做autoencode师崎。
為了避免過(guò)擬合,使用ridge regression的方法:
L2范式正則化椅棺。Z矩陣是由一系列Gaussian函數(shù)組成犁罩,每個(gè)Gaussian函數(shù)計(jì)算的是兩個(gè)樣本之間的distance similarity。這里的Z與之前我們介紹的Gaussian SVM中的kernel K是一致的两疚。當(dāng)時(shí)使用ridge regression得到的解:
比較一下kernel ridgeregression與regularized full RBF Network的β解床估,形式上相似但不完全相同。這是因?yàn)閞egularization不一樣诱渤,在kernel ridgeregression中丐巫,是對(duì)無(wú)限多維的特征轉(zhuǎn)換做regularization,而在regularized full RBF Network中勺美,是對(duì)有限維(N維度)的特征轉(zhuǎn)換做regularization递胧。因此,兩者的公式解有細(xì)微差別赡茸。
對(duì)于解決過(guò)擬合缎脾,還有另外的一種方法,可以選擇K個(gè)具有代表性的點(diǎn)來(lái)代表這N個(gè)點(diǎn)占卧,這樣減少了中間點(diǎn)減少了權(quán)重的數(shù)量遗菠,VC維就減少了,可以起到regularization的作用华蜒。
原本的問(wèn)題是求解中心點(diǎn)μ辙纬,β權(quán)重,現(xiàn)在β可以通過(guò)回歸求解友多,那么只需要求μ了牲平。
K Mean Algorithm
選擇代表的原因,就是因?yàn)檫@些點(diǎn)有很高的相似性域滥,所以可以使用一個(gè)中心點(diǎn)來(lái)代表纵柿,從所有的點(diǎn)中選擇幾個(gè)有代表性的點(diǎn)蜈抓。
首先聚類算法是一種非監(jiān)督的算法,不需要有l(wèi)abel昂儒。需要確定的一般就是兩個(gè)變量沟使,分群值Sm,沒(méi)一個(gè)分類可以表示為S1,S2,S3,S4...Sm渊跋,另一個(gè)就是中心值μm腊嗡,μ1,μ2拾酝,μ3燕少,μ4...μm,每一個(gè)分群就對(duì)應(yīng)著中心蒿囤,要求的就是這個(gè)中心客们。對(duì)于這類問(wèn)題的優(yōu)化,就可以使用square error function了材诽。優(yōu)化的步驟也是一樣底挫,求導(dǎo),梯度下降或者梯度為0求最優(yōu)值解脸侥。
剛剛也說(shuō)過(guò)了建邓,既然是衰減的形式,那么只需要取最大的就好了睁枕,最大也就意味著這需要求距離最近的即可官边。所以,表達(dá)式里面只有屬于這個(gè)類別的數(shù)據(jù)求error譬重。
最后就是求導(dǎo)做優(yōu)化了:
兩個(gè)變量組合的優(yōu)化問(wèn)題拒逮,通常的方法就是對(duì)這兩個(gè)變量分別求。仔細(xì)觀察一下這兩個(gè)變量臀规,可以發(fā)現(xiàn)滩援,只要確定了μ,就可以確定S塔嬉;或者只要確定了S玩徊,求個(gè)平均也可以得到μ。所以假設(shè)μ已經(jīng)是固定的了谨究,那么可以依次迭代x恩袱,和哪個(gè)μ的距離最小就屬于哪個(gè)類別。
如果類別S是確定的胶哲,那么目標(biāo)就是找到對(duì)應(yīng)的μ中心點(diǎn)畔塔,顯然這個(gè),求個(gè)導(dǎo)的事,梯度下降就可以解決了澈吨。
所以這就成了一個(gè)雞生蛋蛋生雞的問(wèn)題把敢,所以一般一開始我們會(huì)選擇隨機(jī)的幾個(gè)點(diǎn)作為中心μ,然后按照上訴步驟優(yōu)化谅辣。
優(yōu)化有結(jié)果嗎修赞?
這個(gè)優(yōu)化的過(guò)程好像有些不一樣,求導(dǎo)等于0應(yīng)該是直接求出了最優(yōu)的解桑阶,linear regression就是這個(gè)道理柏副,但是為什么要一直這樣迭代呢?這是因?yàn)榍蟪鰜?lái)的這個(gè)μ并不是一個(gè)全局的μ蚣录,只是在當(dāng)前對(duì)于每一個(gè)群S的一個(gè)最優(yōu)割择,但是這個(gè)S并不是最優(yōu)的,之前也說(shuō)了:這個(gè)S和μ是互相牽制的包归,雞生蛋蛋生雞的問(wèn)題锨推,S可以得到μ铅歼,μ也可以得到S公壤。所以整個(gè)過(guò)程通俗點(diǎn)就是通過(guò)μ求局部最優(yōu)的S,通過(guò)S有球局部的最優(yōu)μ椎椰,不斷的迭代厦幅,慢慢的跑到全局。但是也沒(méi)有可以跑到局部呢慨飘?這個(gè)是有可能的确憨,這于初值有關(guān),所以Kmean均值算法也是一個(gè)初值敏感的算法瓤的。對(duì)于局部這個(gè)問(wèn)題休弃,有一種解法就是可以合并最近的幾個(gè)質(zhì)心。事實(shí)上如果中心比較小圈膏,比如3個(gè)這樣塔猾,一般都不會(huì)有局部出現(xiàn),因?yàn)?img class="math-block" src="https://math.jianshu.com/math?formula=%5Csum_%7Bm%3D1%7D%5EM(x_n%20-%20%CE%BC_m)%5E2" alt="\sum_{m=1}^M(x_n - μ_m)^2" mathimg="1">不會(huì)這么的彎曲稽坤。
停止是一定的丈甸,因?yàn)闊o(wú)論是通過(guò)S優(yōu)化μ還是μ優(yōu)化S都朝Ein = 0為目的,如果Ein增加了是不會(huì)繼續(xù)的尿褪,所以最后一定會(huì)到達(dá)一個(gè)平衡點(diǎn)睦擂。
The process of the RBF Network
既然中心有其他算法可以幫忙解決了,那么整個(gè)算法也就清晰了:
求解優(yōu)化的過(guò)程中杖玲,可以使用validation來(lái)求解最優(yōu)的λ和M顿仇。
RBF Network and KMeans in action
k值的大小和初始位置的不同都會(huì)影響聚類的結(jié)果。
把這些機(jī)構(gòu)k均值使用到RBF里面:
對(duì)于正則化也有不同的影響。
coding
KMeans
接下來(lái)就是代碼實(shí)現(xiàn)KMeans算法了臼闻。KMeans算法其實(shí)很簡(jiǎn)單跪帝,首先隨機(jī)得到幾個(gè)中心點(diǎn),根據(jù)中心點(diǎn)預(yù)測(cè)做聚類算法即可些阅。
def loadDataSet():
'''loading data......'''
data = dataSet.load_iris()
dataset = data.data
target = data.target
PCA = pca.PCA(n_components=2)
dataset = PCA.fit_transform(dataset)
return np.mat(dataset), np.mat(target)
pass
加載數(shù)據(jù)伞剑,iris數(shù)據(jù)集進(jìn)行降維操作便于可視化。
def distEclud(vecA, vecB):
'''calculate the distance from vecA to vecB'''
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
pass
def randCent(dataSet, k):
'''create the center'''
n = np.shape(dataSet)[1]
centroids = np.mat(np.zeros((k, n)))
for j in range(n):
minJ = np.min(dataSet[:, j])
rangeJ = float(max(dataSet[:, j]) - minJ)
centroids[:, j] = minJ + rangeJ * np.random.rand(k, 1)
return centroids
計(jì)算距離市埋,隨機(jī)選擇中心點(diǎn)黎泣。隨機(jī)選擇中心點(diǎn)這里是先計(jì)算了每一個(gè)維度的范圍,之后在這個(gè)范圍里面隨機(jī)選擇缤谎。
def KMeans(dataSet, k, distMeas = tool.distEclud, createCent = tool.randCent):
'''KMeans Algorithm is running......'''
m = np.shape(dataSet)[0]
clusterAssment = np.mat(np.zeros((m, 2)))
centroids = createCent(dataSet, k)
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m):
minDist = np.inf
minIndex = -1
for j in range(k):
distJI = distMeas(centroids[j,:], dataSet[i,:])
if distJI < minDist:
minDist = distJI
minIndex = j
if clusterAssment[i, 0] != minIndex:
clusterChanged = True
clusterAssment[i, :] = minIndex, minDist**2
for cent in range(k):
ptsInClust = dataSet[np.nonzero(clusterAssment[:, 0].A == cent)[0]]
centroids[cent, :] = np.mean(ptsInClust, axis=0)
dataFrame = pd.DataFrame(data=np.hstack((dataSet, clusterAssment[:,0])))
return dataFrame, centroids
選擇和calculate distance的算法都是動(dòng)態(tài)的方式抒倚,便于以后的改進(jìn)。整個(gè)過(guò)程也比較簡(jiǎn)單坷澡,離哪個(gè)近就屬于哪個(gè)類別托呕。
RBF Network
①獲取中心點(diǎn)
_,center = kMeans.KMeans(np.mat(x_train), k)
剛剛寫好的KMeans就是這個(gè)作用。
②計(jì)算β值
beta = rbf(x_train, center, y_train, gama=gamma, lamda=lamda)
rbf函數(shù)的實(shí)現(xiàn):
def rbf(x_train, center, y_train, gama = 0.001, lamda = 0.01):
M = center.shape[0]
N = len(x_train)
Z = np.zeros((M, N))
for i in range(M):
for j in range(N):
Z[i][j] = Gaussian(x_train[j], center[i], gama)
I1 = np.eye(N, k = 0)
beta = np.linalg.inv(np.dot(Z.T, Z) + lamda * I1)
beta = np.dot(beta, Z.T)
y_train = np.mat(y_train)
beta = np.dot(y_train, beta)
return beta
pass
def Gaussian(vecA, vecB, gama):
x_x = np.abs(np.sum(vecA - vecB))
x_x_2 = np.power(x_x, 2)
return np.exp(-1.0 * gama * x_x_2)
pass
首先是計(jì)算Z矩陣频敛,就是φ(x)的矩陣项郊。其實(shí)就是和上面步驟一模一樣的,使用的是線性回歸斟赚,使用直接就可以算着降,要是邏輯回歸也是一樣。
③預(yù)測(cè)
def predict(beta, x_train, center, gama):
result = []
for x in x_train:
x = np.mat(x)
sum = 0
for i, vecB in enumerate(center):
sum += beta[0,i]*Gaussian(x, vecB, gama)
result.append(sum)
return result
pass
為了方便調(diào)用拗军,整合成一個(gè)函數(shù):
def RBF(y_test, x_test, y_train, x_train, gamma = 0.001, lamda = 0.01, k = 4):
Again = True
while Again == True:
_,center = kMeans.KMeans(np.mat(x_train), k)
beta = rbf(x_train, center, y_train, gama=gamma, lamda=lamda)
Again = False
for i in range(beta.shape[1]):
if np.isnan(beta[0, i]):
Again = True
result = predict(beta, x_train, center, gamma)
for i in range(len(result)):
if result[i] > 0:
result[i] = 1
else:
result[i] = -1
posibility = 0
for i in range(len(result)):
if result[i] == y_train[i]:
posibility += 1
train_accuracy = posibility/len(result)
result = predict(beta, x_test, center, gamma)
for i in range(len(result)):
if result[i] > 0:
result[i] = 1
else:
result[i] = -1
posibility = 0
for i in range(len(result)):
if result[i] == y_test[i]:
posibility += 1
test_accuracy = posibility/len(result)
return train_accuracy, test_accuracy
可以計(jì)算不同gamma任洞,lamda,k的影響发侵。
④獲取數(shù)據(jù)
def load_data():
data = dataset.load_breast_cancer().data
target = dataset.load_breast_cancer().target
for i in range(len(target)):
if target[i] == 0:
target[i] = -1
x_train, x_test, y_train, y_test = train_test_split(data, target, random_state=42, shuffle=True, test_size=0.4)
return x_train, x_test, y_train, y_test
pass
⑤啟動(dòng)函數(shù)
if __name__ == '__main__':
x_train, x_test, y_train, y_test = load_data()
gamma = [1,0.1,0.01,0.001,0.0001]
lamda = gamma
train_accuracy = []
test_accutacy = []
c = ['red', 'blue', 'orange', 'green', 'yellow', 'black']
for n, i in enumerate(gamma):
for j in lamda:
train, text = RBF(x_test=x_test, y_test=y_test, x_train=x_train, y_train=y_train, gamma=i, lamda=j)
print('gama : ',i, ' lamda : ', j, ' train_accuracy : ', train, ' text_accuray : ', text)
train_accuracy.append(train)
test_accutacy.append(text)
plt.plot(lamda, train_accuracy, c = c[n], label = 'gamma:'+str(i) + ' (train)')
plt.plot(lamda, test_accutacy, c = c[n], linestyle='--', label = 'gamma:'+str(i) + ' (test)')
plt.xlabel('lambda')
plt.ylabel('accuracy')
plt.legend(loc = 'upper right')
train_accuracy = []
test_accutacy = []
plt.show()
for n, i in enumerate(lamda):
for j in gamma:
train, text = RBF(x_test=x_test, y_test=y_test, x_train=x_train, y_train=y_train, gamma=j, lamda=i)
print('lamda : ',i, ' gama : ', j, ' train_accuracy : ', train, ' text_accuray : ', text)
train_accuracy.append(train)
test_accutacy.append(text)
plt.plot(gamma, train_accuracy, c = c[n], label = 'lamda:'+str(i) + ' (train)')
plt.plot(gamma, test_accutacy, c = c[n], linestyle='--', label = 'lamda:'+str(i) + ' (test)')
plt.xlabel('gamma')
plt.ylabel('accuracy')
plt.legend(loc = 'upper right')
train_accuracy = []
test_accutacy = []
plt.show()
ks = [2,3,4,5,6,7]
train_accuracy = []
test_accutacy = []
for i in range(6):
for n, i in enumerate(ks):
train, text = RBF(x_test=x_test, y_test=y_test, x_train=x_train, y_train=y_train, gamma=0.0001, lamda=0.01, k=i)
print('k == ' + str(i))
train_accuracy.append(train)
test_accutacy.append(text)
plt.plot(ks, train_accuracy, c = c[n], label = 'train')
plt.plot(ks, test_accutacy, c = c[n], linestyle='--', label = 'test')
plt.xlabel('the number of k')
plt.ylabel('accuracy')
plt.legend(loc = 'upper left')
plt.show()
train_accuracy = []
test_accutacy = []
pass
效果的討論
在運(yùn)行函數(shù)得到結(jié)果后進(jìn)行分析交掏。
①當(dāng)γ固定了,看看lamda變化對(duì)于結(jié)果的影響刃鳄。
其實(shí)還是很正常的盅弛,隨著gamma的減少,準(zhǔn)確率慢慢提上去了铲汪,虛線的測(cè)試數(shù)據(jù)熊尉,直線是準(zhǔn)確率。Gaussian函數(shù):γ越小掌腰,就相當(dāng)于σ變大狰住,高斯函數(shù)的標(biāo)準(zhǔn)差變大那么這個(gè)函數(shù)就會(huì)變的更加平滑,泛化能力會(huì)很強(qiáng)齿梁。其實(shí)就是regularization的過(guò)程催植。
觀察上圖是可以得到λ對(duì)于整體的影響不會(huì)太大肮蛹。基本是平緩的创南。
②當(dāng)λ固定了伦忠,看看γ變化對(duì)于結(jié)果的影響。
γ越小效果越好稿辙,但是如果γ非常小昆码,那么λ對(duì)于模型的影響幾乎是沒(méi)有影響。
③對(duì)于k的數(shù)量和準(zhǔn)確率的討論
效果不太穩(wěn)定邻储,我多做了幾次赋咽。
效果非常非常不穩(wěn)定桩了,我之前懷疑是線性回歸的解不穩(wěn)定的緣故一忱,之前學(xué)習(xí)到病態(tài)矩陣典徘,也就是近似奇異矩陣的矩陣牛郑,而regularization L2正則化就是為了使得病態(tài)矩陣轉(zhuǎn)換成正常矩陣,所以增大了λ胸嘴,顯然并沒(méi)有什么卵用绪杏。雖然整體效果不錯(cuò)轮锥。上面的結(jié)果就已經(jīng)是λ增大的結(jié)果了勾扭。
所以最后還有兩個(gè)問(wèn)題沒(méi)有解決毡琉,一個(gè)就是λ為什么對(duì)于模型的影響很很小,另一個(gè)上面沒(méi)有提到尺借,為什么測(cè)試數(shù)據(jù)的準(zhǔn)確率會(huì)大于訓(xùn)練數(shù)據(jù)的準(zhǔn)確率绊起?這還打的明顯,不知道是不是沒(méi)有做交叉驗(yàn)證的結(jié)果燎斩,因?yàn)閼小7湟铩Uけ怼!V翱吹降慕忉屖牵?/h4>
如果程序很好的實(shí)現(xiàn)了模型师枣,那么就是模型不適合你的數(shù)據(jù)怪瓶,因?yàn)檫@表明存在如下問(wèn)題:每次訓(xùn)練,都使得訓(xùn)練之后的模型對(duì)測(cè)試的 1折效果很好践美,而對(duì)用于訓(xùn)練的9折效果慘淡洗贰,也就是模型落入了局部極值點(diǎn)而非全局極值點(diǎn)。這很有可能是模型在具體數(shù)據(jù)下的失效問(wèn)題陨倡。
如果程序很好的實(shí)現(xiàn)了模型师枣,那么就是模型不適合你的數(shù)據(jù)怪瓶,因?yàn)檫@表明存在如下問(wèn)題:每次訓(xùn)練,都使得訓(xùn)練之后的模型對(duì)測(cè)試的 1折效果很好践美,而對(duì)用于訓(xùn)練的9折效果慘淡洗贰,也就是模型落入了局部極值點(diǎn)而非全局極值點(diǎn)。這很有可能是模型在具體數(shù)據(jù)下的失效問(wèn)題陨倡。
但是這個(gè)問(wèn)題已經(jīng)重復(fù)過(guò)了很多次敛滋,一直在使用test_train_split區(qū)分,同時(shí)也有shuffle兴革。事實(shí)上在γ比較小的時(shí)候绎晃,測(cè)試數(shù)據(jù)就超過(guò)了訓(xùn)練數(shù)據(jù)的準(zhǔn)確率蜜唾,上面γ的變化可以看到。
最后附上GitHub代碼:https://github.com/GreenArrow2017/MachineLearning/tree/master/MachineLearning/RBFNetwork