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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ML机器学习基础的编程技巧:

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ML机器学习基础的编程技巧: 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

一、One_hot編碼:(邏輯回歸or神經網絡)?

二、評估classificaition_report

三、序列化&解序列化

四、神經網絡的隨機初始化

? ? ?五、特征值映射 Feature-mapping

六、特征值縮放->歸一化和標準化

七、Learning Curve學習曲線->判斷high bia/var?

八、數據的訓練集、交叉驗證集、測試集的應用:

九、支持向量機svm的使用

十、利用meshgrid與contour繪制二維高階的決策邊界

十一、K-means算法

十二、PCA降維

十三、異常檢測

一、One_hot編碼:(邏輯回歸or神經網絡)

?二、評估classificaition_report

?三、序列化&解序列化

?四、神經網絡的隨機初始化

五、特征值映射 Feature-mapping

def feature_mapping(x1,x2,power):data={} #建立一個空字典for i in np.arange(power+1):for j in np.arange(i+1):data['F{}{}'.format(i-j,j)]=np.power(x1,i-j)*np.power(x2,j)return pd.DataFrame(data)

六、特征值縮放->歸一化和標準化

?場景一:有訓練集train、交叉驗證集cv和測試集test.

? ? ? ? 一般只需要訓練集的mean和std即可

? ? ? ? ? ? ? ? ->why:

? ? ? ? ?注意:不同特征mean和std是需要進行分別去求的,不能夠混合求

七、Learning Curve學習曲線->判斷high bia/var

八、數據的訓練集、交叉驗證集、測試集的應用:

用交叉驗證集選擇最佳lambda

# 用交叉驗證集選擇lmd lamdas = [0, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1, 3, 10] training_cost = [] cv_cost = [] for lamda in lamdas:res = train_model(X_train_norm, y_train, lamda)tc = reg_cost(res, X_train_norm, y_train, lamda=0)#計算訓練集上的誤差cv = reg_cost(res, X_val_norm, y_val, lamda=0)#計算驗證集上的誤差training_cost.append(tc)cv_cost.append(cv)plt.plot(lamdas, training_cost, label='training cost')#不同lamda取值下訓練集的損失 plt.plot(lamdas, cv_cost, label='cv cost') plt.legend() plt.show()#拿到最佳lamda bestLamda = lamdas[np.argmin(cv_cost)] print(bestLamda)#3 #用最佳lamda來訓練測試集 res = train_model(X_train_norm, y_train, bestLamda) print(reg_cost(res, X_test_norm, y_test, lamda=0))#4.3976161577441975

由訓練集(帶lambda訓練)得到theta,->通過看何時cv_cost最小,取為bestLambda->用于test集

九、支持向量機svm的使用

from sklearn.svm import SVC

①用SVC函數初始化一個對象出來

? ? ? ? 常用參數有:C、kernel、gamma

svc1 = SVC(C=1,kernel='linear')

②喂訓練集的X_train與y_train-->擬合參數

? ? ? ? ? ? ? ? 注意y是一維的---flatten降維度操作

svc1.fit(X,y.flatten())

③給定X_d預測相關的y

svc1.predict(X)

④將原來的X_train與y_train給出--->可以得知準確率

svc1.score(X,y.flatten())

補充:尋找最優的C與gamma?

十、利用meshgrid與contour繪制二維高階的決策邊界

1.原理與應用展示

?如上圖,一一組合,構成了網格的一個個坐標(注意y每一行都是相同的元素,x是每一列)

?

?

例1:

x=np.linspace(-1.2,1.2,200) xx,yy=np.meshgrid(x,x)#生成兩個網格(200,200) z=feature_mapping(xx.ravel(),yy.ravel(),6).values z=np.c_[np.ones(z.shape[0]),z] zz=z@theta_final zz=zz.reshape(xx.shape) plt.contour(xx,yy,zz,1)

?2.應用:

值得注意的是這邊的np.c_[ ]將兩個flatten()之后的一維數組,變成了(k,2)二維的數組

十一、K-means算法

1.介紹:

?2.具體代碼實現細節:

? ? ? ? ①有關np.linalg.norm()解析

? ? ? ? ②函數:

? ? ? ? ?③初始化聚類點的選取:

def init_centros(X,k):index = np.random.choice(len(X),k)return X[index] #此處仍然利用的是bool索引->隨機選擇出k個坐標

3.案例演示:使用kmeans對圖片顏色進行聚類

①RGB圖像,每個像素點值范圍0-255

? ? 圖片的讀取---?

from skimage import io

?②用16個聚類重構該圖片:

十二、PCA降維

1.PCA相關簡介

?2.執行步驟

?3.調用numpy的線性代數庫

U,S,V = np.linalg.svd(C)

十三、異常檢測

1.算法流程:

?2.具體的細節:

?3.案例代碼:

①獲取訓練集中樣本特征的均值和方差

def estimateGaussian(X,isCovariance):means = np.mean(X,axis=0)if isCovariance:sigma2 = (X-means).T@(X-means) / len(X)else:sigma2 = np.var(X,axis=0)return means,sigma2

相同數據兩者的區別:

?注:原高斯分布模型是多元高斯分布模型的一種特殊情況(如果協方差矩陣只在對角線的單位上有非零的值,即為原本的高斯分布模型)? ? ??

②多元正態分布密度函數

再給出相關實現代碼之前,了解一下np.diag()的使用方法

?(1)對于一個二維矩陣,直接進行了降維操作,只取對角線上的元素.

?(2)對于一個一維矩陣,斜對角線上自動補零,構成二維的矩陣。

def gaussian(X,means,sigma2):if np.ndim(sigma2) == 1:sigma2 = np.diag(sigma2)X = X - meansn = X.shape[1]#X:(307,2) sigma:(2,2) X.T:(2,307)--->(307,307)first = np.power(2*np.pi,-n/2)*(np.linalg.det(sigma2)**(-0.5))second =np.diag(X@np.linalg.inv(sigma2)@X.T) #np.diag操作對象為二維數組,取對角線元素構成新的一維數組(307,)p = first * np.exp(-0.5*second)p = p.reshape(-1,1) #p---->(307,1)# m = len(X) # second = np.zeros(m,1) # for row in range(m): # second[row] = X[row].T @ np.linalg.inv(sigma2) @ X[row] # p = first * np.exp(-0.5*second)return p

注意:

? ? ? ? (i)利用np.ndim判斷是否是一個一維數組,是-->將其上升一個維度.(真正變成多元正態分布的一個特殊情況.)

? ? ? ? (ii)np.linalg.det計算行列式的值,np.linalg.inv對一個矩陣取逆

? ? ? ? (iii)second一開始的維度是(307,307)實際上只有對角線上才是對應的p,上面的代碼等效于下面注釋的一塊代碼(用numpy的庫進行矩陣運算可能會更快一點)

③繪圖

def plotGaussian(X,means,sigma2):x = np.arange(0, 30, 0.5) y = np.arange(0, 30, 0.5)xx, yy = np.meshgrid(x,y) z= gaussian(np.c_[xx.ravel(),yy.ravel()], means, sigma2) # 計算對應的高斯分布函數zz = z.reshape(xx.shape) plt.plot(X[:,0],X[:,1],'bx')contour_levels = [10**h for h in range(-20,0,3)]#列表解析, 10的負數次次方-->保證概率在0-1之間plt.contour(xx, yy, zz, contour_levels)

④通過F1_score選取最佳的epsilon

def selectThreshold(yval,p):bestEpsilon = 0bestF1 = 0epsilons = np.linspace(min(p),max(p),1000)for e in epsilons:p_ = p < etp = np.sum((yval == 1) & (p_ == 1))fp = np.sum((yval == 0) & (p_ == 1))fn = np.sum((yval == 1) & (p_ == 0))prec = tp / (tp + fp) if (tp+fp) else 0 #細節:防止分母是0!!!----NaNrec = tp / (tp + fn) if (tp+fn) else 0F1_e = 2 * prec * rec / (prec + rec) if (prec + rec) else 0if F1_e > bestF1:bestF1 = F1_ebestEpsilon = ereturn bestEpsilon,bestF1

?高維數據的異常檢測:

十四、案例----推薦系統->協同過濾算法:

1.參數的說明與數據的預處理

Y.shape=(1682,943)=R.shape

X.shape=(1682,10)? Theta.shape=(943,10)

注:參數nm-->num of movies? nu-->num of users? nf-->num of features

在編寫cost_function和gradient之前,由于opt.minimize的x0參數必須要傳入一個一維數組,所以寫好序列化參數和解序列化的參數代碼:

def serialize(X,Theta):return np.append(X.flatten(),Theta.flatten()) ##### def deserialize(params,nm,nu,nf):X = params[:nm*nf].reshape(nm,nf)Theta = params[nm*nf:].reshape(nu,nf)return X,Theta

2.代價函數與梯度(帶正則)

? ? ? ? ①代價函數

def costFunction(params,Y,R,nm,nu,nf,lamda):X,Theta = deserialize(params,nm,nu,nf)error = 0.5 * np.square((X@Theta.T - Y)* R).sum()#點乘Rreg1 = 0.5 * lamda * np.square(X).sum()reg2 = 0.5 * lamda * np.square(Theta).sum()return error + reg1 + reg2

注:點乘R是為了保證是評價過的電影才算入cost中。

##test users = 4 movies = 5 features = 3 X_sub = X[:movies,:features] Theta_sub = Theta[:users,:features] Y_sub = Y[:movies,:users] R_sub = R[:movies,:users] cost1 = costFunction(serialize(X_sub,Theta_sub),Y_sub,R_sub,movies,users,features,lamda = 0) cost1 ##22.224603725685675

def costGradient(params,Y,R,nm,nu,nf,lamda):X,Theta = deserialize(params,nm,nu,nf)X_grad = ((X@Theta.T-Y)*R)@Theta +lamda * XTheta_grad = ((X@Theta.T-Y)*R).T@X + lamda * Thetareturn serialize(X_grad,Theta_grad)

(i)注意維度對應

(ii)注意點乘R

3.添加一個新用戶?

my_ratings = np.zeros((nm,1)) my_ratings[9] = 5 my_ratings[66] = 5 my_ratings[96] = 5 my_ratings[121] = 4 my_ratings[148] = 4 my_ratings[285] = 3 my_ratings[490] = 4 my_ratings[599] = 4 my_ratings[643] = 4 my_ratings[958] = 5 my_ratings[1117] = 3Y = np.c_[Y,my_ratings] R = np.c_[R,my_ratings!=0]nm,nu = Y.shape

Y.shape=(1682, 944)

4.均值歸一化與參數的初始化

def normalizeRatings(Y,R):Y_mean =(Y.sum(axis=1) / R.sum(axis=1)).reshape(-1,1)Y_norm = (Y - Y_mean) * Rreturn Y_norm,Y_meanY_norm,Y_mean = normalizeRatings(Y,R) X = np.random.random((nm,nf)) Theta = np.random.random((nu,nf)) params = serialize(X,Theta) lamda = 10

5.訓練模型并預測

#-------訓練模型---------- from scipy.optimize import minimize res = minimize(fun = costFunction,x0 = params,args = (Y_norm,R,nm,nu,nf,lamda),method = 'TNC',jac = costGradient,options = {'maxiter':100}) params_fit = res.x fit_X,fit_Theta = deserialize(params_fit,nm,nu,nf) #---------預測--------- Y_pred = fit_X@fit_Theta.T y_pred = Y_pred[:,-1] + Y_mean.flatten()#預測自己新添加的 index = np.argsort(-y_pred)#默認自小到大,加上一個負號就是反向or在最后加上[::-1] print(index[:10])#array([1466, 1292, 1200, 1499, 1121, 1652, 813, 1598, 1188, 1535])#讀取對應的電影名稱 movies = [] with open('data/movie_ids.txt','r',encoding='latin 1') as f:for line in f:tokens = line.strip().split(' ')movies.append(' '.join(tokens[1:]))print(len(movies))#1682for i in range(10):print(index[i],movies[index[i]],y_pred[index[i]]) ''' 1466 Saint of Fort Washington, The (1993) 5.001810464524898 1292 Star Kid (1997) 5.001694543358842 1200 Marlene Dietrich: Shadow and Light (1996) 5.00149967272587 1499 Santa with Muscles (1996) 5.001334854576942 1121 They Made Me a Criminal (1939) 5.000999967820586 1652 Entertaining Angels: The Dorothy Day Story (1996) 5.000975637072753 813 Great Day in Harlem, A (1994) 5.000799086576183 1598 Someone Else's America (1995) 5.0006016104689905 1188 Prefontaine (1997) 5.000467537343162 1535 Aiqing wansui (1994) 5.000239077425466 '''

總結

以上是生活随笔為你收集整理的ML机器学习基础的编程技巧:的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。