#coding=utf-8 #CS229 BGD+LR import numpy as np import pandas as pd import math def sigmoid(x): return 1.0/(1+np.exp(-x)) def CrossEntropy(w0,x,y): predict_error=np.sum(w0 * x.T,axis=1) y=np.squeeze(y) predict_error = predict_error-y # 得到预测误差向量 J = sum(y*np.log(sigmoid(predict_error))+(1-y)*np.log(1-sigmoid(predict_error))) return J/len(y) def BGD(x,y): stp = 0.001 x = np.append(x, np.ones((x.shape[0], 1)), axis=1) # 加入常数列 # 以整个数据集作为训练数据 BGD w0 = np.ones(x.shape[1]).T max_iters = 15000 iter_count = 0 eps = 0.001 w0 = np.array(w0).reshape(len(w0), 1) w0 = w0.T loss = float(30) y = np.squeeze(y) x = x.T w0 = sum(w0) while (iter_count < max_iters): oldJ = CrossEntropy(w0, x, y) predict_error = np.matmul(w0, x) - y#得到预测误差向量 print("w0_old",w0) for i in range(x.shape[0]): w0[i] = w0[i] - stp * sum(predict_error * x[i, :]) # x[i,:]#所有x样本的第i个分量 print("w0_new",w0) iter_count = iter_count + 1 newJ = CrossEntropy(w0,x,y) print("oldJ,newJ",oldJ,newJ) if newJ==oldJ: print("已收敛") print('\n iteration=', iter_count, 'loss=', newJ) return w0 print('\n iteration=', iter_count, 'loss=', newJ) return w0 if __name__ =='__main__': q1x = pd.read_table(r'D:\研究生课程材料\模式识别与机器学习\第六章选做作业\q1x.dat', names=['x_1', 'x_2'], sep=' ', encoding='utf-8') # q2x=pd.read_table(r'D:\研究生课程材料\模式识别与机器学习\第六章选做作业\q2x.dat', # names=['x_1','x_2'],sep=' ',encoding='utf-8') q1y = pd.read_table(r'D:\研究生课程材料\模式识别与机器学习\第六章选做作业\q1y.dat', names=['y'], sep=' ', encoding='utf-8') # q2y=pd.read_table(r'D:\研究生课程材料\模式识别与机器学习\第六章选做作业\q2y.dat', # names=['x_1','x_2'],sep=' ',encoding='utf-8') x = q1x.values y = q1y.values w=BGD(x,y) print(w)
BGD+交叉熵实现二分类,数据和题目来自CS229监督学习的课后题
最新推荐文章于 2021-04-27 20:25:54 发布