m,n = X.shape[0],X.shape[1] #m=51,n=2 pos,neg= (y==1).reshape(m,1), (y==0).reshape(m,1) #分别找出y为0和y为1对应的俩个特征值X1,X2,将两个特征值当作横坐标与纵坐标 plt.scatter(X[pos[:,0],0],X[pos[:,0],1],c="r",marker="+",s=50)#plt.scatter()函数绘制散点图,色彩选为红色,用“+”表示,大小设置为50 plt.scatter(X[neg[:,0],0],X[neg[:,0],1],c="y",marker="o",s=50)#plt.scatter()
时间: 2023-06-14 07:08:16 浏览: 47
函数绘制散点图,色彩选为黄色,用“o”表示,大小设置为50。这段代码的作用是将数据集中y为1的点用红色加号标出,y为0的点用黄色圆圈标出。其中,X[pos[:,0],0]表示选取y为1的点的第一个特征值,X[pos[:,0],1]表示选取y为1的点的第二个特征值,X[neg[:,0],0]表示选取y为0的点的第一个特征值,X[neg[:,0],1]表示选取y为0的点的第二个特征值。
相关问题
简化并解释每行代码:X_train, y_train = load_data("data/ex2data2.txt") plot_data(X_train, y_train[:], pos_label="Accepted", neg_label="Rejected") plt.ylabel('Microchip Test 2') plt.xlabel('Microchip Test 1') plt.legend(loc="upper right") plt.show() mapped_X = map_feature(X_train[:, 0], X_train[:, 1]) def compute_cost_reg(X, y, w, b, lambda_=1): m = X.shape[0] cost = 0 f = sigmoid(np.dot(X, w) + b) reg = (lambda_/(2*m)) * np.sum(np.square(w)) cost = (1/m)np.sum(-ynp.log(f) - (1-y)*np.log(1-f)) + reg return cost def compute_gradient_reg(X, y, w, b, lambda_=1): m = X.shape[0] cost = 0 dw = np.zeros_like(w) f = sigmoid(np.dot(X, w) + b) err = (f - y) dw = (1/m)*np.dot(X.T, err) dw += (lambda_/m) * w db = (1/m) * np.sum(err) return db,dw X_mapped = map_feature(X_train[:, 0], X_train[:, 1]) np.random.seed(1) initial_w = np.random.rand(X_mapped.shape[1]) - 0.5 initial_b = 0.5 lambda_ = 0.5 dj_db, dj_dw = compute_gradient_reg(X_mapped, y_train, initial_w, initial_b, lambda_) np.random.seed(1) initial_w = np.random.rand(X_mapped.shape[1])-0.5 initial_b = 1. lambda_ = 0.01; iterations = 10000 alpha = 0.01 w,b, J_history,_ = gradient_descent(X_mapped, y_train, initial_w, initial_b, compute_cost_reg, compute_gradient_reg, alpha, iterations, lambda_) plot_decision_boundary(w, b, X_mapped, y_train) p = predict(X_mapped, w, b) print('Train Accuracy: %f'%(np.mean(p == y_train) * 100))
这段代码主要实现了一个二分类问题的训练和预测。下面是每一行代码的解释:
```
X_train, y_train = load_data("data/ex2data2.txt")
```
从文件中读取训练数据,将特征存储在X_train中,将标签存储在y_train中。
```
plot_data(X_train, y_train[:], pos_label="Accepted", neg_label="Rejected")
plt.ylabel('Microchip Test 2')
plt.xlabel('Microchip Test 1')
plt.legend(loc="upper right")
plt.show()
```
画出训练数据的散点图,其中Accepted为正例标签,Rejected为负例标签,横坐标为Microchip Test 1,纵坐标为Microchip Test 2。
```
mapped_X = map_feature(X_train[:, 0], X_train[:, 1])
```
将原始特征映射成更高维的特征,以便更好地拟合非线性决策边界。
```
def compute_cost_reg(X, y, w, b, lambda_=1):
m = X.shape[0]
cost = 0
f = sigmoid(np.dot(X, w) + b)
reg = (lambda_/(2*m)) * np.sum(np.square(w))
cost = (1/m)np.sum(-ynp.log(f) - (1-y)*np.log(1-f)) + reg
return cost
```
计算带正则化的逻辑回归代价函数,其中X为特征数据,y为标签,w为权重,b为偏置,lambda_为正则化参数。
```
def compute_gradient_reg(X, y, w, b, lambda_=1):
m = X.shape[0]
cost = 0
dw = np.zeros_like(w)
f = sigmoid(np.dot(X, w) + b)
err = (f - y)
dw = (1/m)*np.dot(X.T, err)
dw += (lambda_/m) * w
db = (1/m) * np.sum(err)
return db,dw
```
计算带正则化的逻辑回归梯度,其中X为特征数据,y为标签,w为权重,b为偏置,lambda_为正则化参数。
```
X_mapped = map_feature(X_train[:, 0], X_train[:, 1])
np.random.seed(1)
initial_w = np.random.rand(X_mapped.shape[1]) - 0.5
initial_b = 0.5
lambda_ = 0.5
dj_db, dj_dw = compute_gradient_reg(X_mapped, y_train, initial_w, initial_b, lambda_)
```
将映射后的特征、权重、偏置和正则化参数传入梯度计算函数,计算出代价函数对权重和偏置的偏导数。
```
np.random.seed(1)
initial_w = np.random.rand(X_mapped.shape[1])-0.5
initial_b = 1.
lambda_ = 0.01; iterations = 10000; alpha = 0.01
w,b, J_history,_ = gradient_descent(X_mapped, y_train, initial_w, initial_b, compute_cost_reg, compute_gradient_reg, alpha, iterations, lambda_)
```
使用梯度下降算法对代价函数进行优化,得到最优的权重和偏置,lambda_为正则化参数,iterations为迭代次数,alpha为学习率。
```
plot_decision_boundary(w, b, X_mapped, y_train)
```
画出决策边界。
```
p = predict(X_mapped, w, b)
print('Train Accuracy: %f'%(np.mean(p == y_train) * 100))
```
使用训练好的模型进行预测,并计算训练精度。
def get_balanced(data, label): pos_index = np.where(label >= 0.5) neg_index = np.where(label < 0.5) rate = neg_index[0].shape[0] // pos_index[0].shape[0] data = np.concatenate((data, data[pos_index].repeat(rate, axis=0)), axis=0) label = np.concatenate((label, label[pos_index].repeat(rate, axis=0)), axis=0) data, label = shuffle(data, label) return data, label
这是一个用于处理不平衡数据集的函数,它的作用是使得正负样本的数量平衡,从而提高模型的性能。具体地,它的实现方法是对正样本进行重复采样,使得正负样本的数量比例接近某个设定的比例(在这里默认为1:1)。
该函数的参数包括:
- data:包含所有样本数据的数组
- label:包含所有样本标签的数组
该函数的返回值包括:
- data:经过平衡处理后的样本数据
- label:经过平衡处理后的样本标签
该函数的实现过程如下:
1. 找出所有正样本和负样本的下标;
2. 计算出正负样本的数量比例,以正样本数量为基准,计算出需要重复采样的倍数;
3. 对正样本进行重复采样,使得正负样本的数量比例接近1:1;
4. 将重复采样后的正样本数据和标签合并到原始数据和标签中;
5. 对新的数据和标签进行随机打乱(shuffle)处理;
6. 返回平衡后的数据和标签。
需要注意的是,这个函数中使用了numpy库中的一些函数,比如np.where、np.concatenate和np.repeat等函数,这些函数可以很方便地对数组进行操作。