日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

机器学习基石作业二中的DECISION_STUMP实现

發(fā)布時(shí)間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习基石作业二中的DECISION_STUMP实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? 概要:在林老的題目描述中,DECISION_STUMP(其實(shí)就是“決策樁”,也就是只有一層的決策樹)。題目中提到了的選去是把屬性(一維的)按照從小到大的順序排列以后取兩個(gè)挨著的值的平均值,網(wǎng)上有人的實(shí)現(xiàn)會(huì)在開頭和結(jié)尾的值手動(dòng)去加一個(gè)小于最小的值,一個(gè)大于最大的值;添加的兩個(gè)值的大小是多大合適,這是個(gè)問題。帶來(lái)的另外一個(gè)問題就是,解釋性變差了;就像《西瓜書》上說(shuō)的,我們按西瓜的甜度區(qū)分西瓜的好壞,你收集到了甜度值是 0.1,0.2,.0.5,0.6,0.9(忽略了好瓜、壞瓜的標(biāo)志),但最后你用了0.35(假設(shè)算法取在了0.2和0.5之間)作為了區(qū)別好瓜和壞瓜的標(biāo)準(zhǔn),這個(gè)值沒有在訓(xùn)練數(shù)據(jù)中出現(xiàn)過(guò),給人的感覺就是:唉,為什么是這個(gè)值,怎么得來(lái)的?所以《西瓜書》提到了可以直接選擇出現(xiàn)的這些值作為,有更好的解釋性。當(dāng)然去均值的方式也是正確的。 但是本人更傾向于直接用出現(xiàn)的值來(lái)作為,所以算法中沒有對(duì)屬性進(jìn)行排序,加一個(gè)大于最大以及一個(gè)小于最小值(在《西瓜書》中,取均值的時(shí)候也沒有做這個(gè)操作,而是直接排序,然后就取兩個(gè)相鄰值的平均值作為了)、取平均值的操作。

? ? ?舉例:有1,3, 2三個(gè)值:

(1)按照從小到大的順序排列以后取兩個(gè)挨著的值的平均值:1 2? ?3;會(huì)得到2個(gè)。

(2)按照從小到大的順序排列以后取兩個(gè)挨著的值的平均值,在開頭和結(jié)尾的值手動(dòng)去加一個(gè)小于最小的值,一個(gè)大于最大的值:0? 1? ?2? ?3? ?4;會(huì)得到4個(gè).

(3)直接取值,得到3個(gè);

這三種方式有所區(qū)別,但對(duì)結(jié)果其實(shí)沒什么影響。下面的代碼使用的是(3)

?util.py(公共方法,加載數(shù)據(jù)用的)

# -*- coding:utf-8 -*- # Author: Evan Mi import numpy as npdef load_data(file_name):x = []y = []with open(file_name, 'r+') as f:for line in f:line = line.rstrip("\n")temp = line.split(" ")temp.insert(0, '1')x_temp = [float(val) for val in temp[:-1]]y_tem = [int(val) for val in temp[-1:]][0]x.append(x_temp)y.append(y_tem)nx = np.array(x)ny = np.array(y)return nx, ny decision_stump_one_dimension.py(對(duì)應(yīng)一維的問題) # -*- coding:utf-8 -*- # Author: Evan Mi import numpy as npdef sign_zero_as_neg(x):"""這里修改了np自帶的sign函數(shù),當(dāng)傳入的值為0的時(shí)候,不再返回0,而是-1;也就是說(shuō)在邊界上的點(diǎn)按反例處理:param x::return:"""result = np.sign(x)result[result == 0] = -1return resultdef data_generator(size):"""生成[-1, 1)之間的隨機(jī)數(shù), 然后加入20%的噪聲,即20%的概率觀測(cè)值取了相反數(shù):param size::return:"""x_arr = np.random.uniform(-1, 1, size)y_arr = sign_zero_as_neg(x_arr)y_arr = np.where(np.random.uniform(0, 1, size) < 0.2, -y_arr, y_arr)print(x_arr)print(y_arr)return x_arr, y_arrdef err_in_counter(x_arr, y_arr, s, theta):"""計(jì)算E_in:param x_arr:[[x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn]...[x1, x2, x3, ... ,xn]]:param y_arr:[[y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn]...[y1, y2, y3, ... ,yn]]:param s:{-1,1}:param theta:[[theta1, theta1, theta1, ... ,theta1][theta2, theta2, theta2, ..., theta2][theta3, theta3, theta3, ..., theta3]...[thetak, thetak, thetak, ..., thetak]]:return:[err_theta1, err_theta2, ..., err_thetak] 中最小的以及下標(biāo)"""result = s * sign_zero_as_neg(x_arr - theta)err_tile = np.where(result == y_arr, 0, 1).sum(1)return err_tile.min(), err_tile.argmin()def err_out_calculator(s, theta):return 0.5 + 0.3 * s * (abs(theta) - 1)def decision_stump_1d(x_arr, y_arr):theta = x_arrtheta_tile = np.tile(theta, (len(x_arr), 1)).Tx_tile = np.tile(x_arr, (len(theta), 1))y_tile = np.tile(y_arr, (len(theta), 1))err_pos, index_pos = err_in_counter(x_tile, y_tile, 1, theta_tile)err_neg, index_neg = err_in_counter(x_tile, y_tile, -1, theta_tile)if err_pos < err_neg:return err_pos / len(y_arr), err_out_calculator(1, theta[index_pos])else:return err_neg / len(y_arr), err_out_calculator(-1, theta[index_neg])if __name__ == '__main__':avg_err_in = 0avg_err_out = 0for i in range(5000):x, y = data_generator(20)e_in, e_out = decision_stump_1d(x, y)avg_err_in = avg_err_in + (1.0 / (i + 1)) * (e_in - avg_err_in)avg_err_out = avg_err_out + (1.0 / (i + 1)) * (e_out - avg_err_out)print("e_in:", avg_err_in)print("e_out:", avg_err_out) decision_stump_multi_dimension.py(對(duì)應(yīng)多維的問題) # -*- coding:utf-8 -*- # Author: Evan Mi import numpy as np from decison_stump import utildef sign_zero_as_neg(x):"""這里修改了np自帶的sign函數(shù),當(dāng)傳入的值為0的時(shí)候,不再返回0,而是-1;也就是說(shuō)在邊界上的點(diǎn)按反例處理:param x::return:"""result = np.sign(x)result[result == 0] = -1return resultdef err_in_counter(x_arr, y_arr, s, theta):"""計(jì)算E_in:param x_arr:[[x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn][x1, x2, x3, ... ,xn]...[x1, x2, x3, ... ,xn]]:param y_arr:[[y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn][y1, y2, y3, ... ,yn]...[y1, y2, y3, ... ,yn]]:param s:{-1,1}:param theta:[[theta1, theta1, theta1, ... ,theta1][theta2, theta2, theta2, ..., theta2][theta3, theta3, theta3, ..., theta3]...[thetak, thetak, thetak, ..., thetak]]:return:[err_theta1, err_theta2, ..., err_thetak] 中最小的以及下標(biāo)"""result = s * sign_zero_as_neg(x_arr - theta)err_tile = np.where(result == y_arr, 0, 1).sum(1)return err_tile.min(), err_tile.argmin()def err_out_counter(x_arr, y_arr, s, theta, dimension):temp = s * sign_zero_as_neg(x_arr.T[dimension] - theta)e_out = np.where(temp == y_arr, 0, 1).sum() / np.size(x_arr, 0)return e_outdef decision_stump_1d(x_arr, y_arr):theta = x_arrtheta_tile = np.tile(theta, (len(x_arr), 1)).Tx_tile = np.tile(x_arr, (len(theta), 1))y_tile = np.tile(y_arr, (len(theta), 1))err_pos, index_pos = err_in_counter(x_tile, y_tile, 1, theta_tile)err_neg, index_neg = err_in_counter(x_tile, y_tile, -1, theta_tile)if err_pos < err_neg:return err_pos / len(y_arr), index_pos, 1else:return err_neg / len(y_arr), index_neg, -1def decision_stump_multi_d(x, y):x = x.Tdimension, e_in, theta, s = 0, float('inf'), 0, 0for i in range(np.size(x, 0)):e_in_temp, index, s_temp = decision_stump_1d(x[i], y)if e_in_temp < e_in:dimension, e_in, theta, s = i, e_in_temp, x[i][index], s_temp# 錯(cuò)誤率相等的時(shí)候隨機(jī)選擇if e_in_temp == e_in:pick_rate = np.random.uniform(0, 1)if pick_rate > 0.5:dimension, e_in, theta, s = i, e_in_temp, x[i][index], s_tempreturn dimension, e_in, theta, sif __name__ == '__main__':x_train, y_train = util.load_data('data/train.txt')x_test, y_test = util.load_data('data/test.txt')determined_dimension, e_in_result, theta_result, s_result = decision_stump_multi_d(x_train, y_train)print("E_IN:", e_in_result)print("E_OUT:", err_out_counter(x_test, y_test, s_result, theta_result, determined_dimension))

? 詳細(xì)項(xiàng)目代碼及代碼使用的數(shù)據(jù)見:DECISION_STUMP

總結(jié)

以上是生活随笔為你收集整理的机器学习基石作业二中的DECISION_STUMP实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。