ggplot2-scale_x_continuous()

scale_x_continuous()ggplot2 中的一个函数,用于 调整 x 轴的比例、范围、刻度、标签等 属性。它属于 “Scales”(比例尺)部分,可以帮助你定制图形中轴的显示方式,使得数据可视化更加符合需求。

功能:

  • 调整 x 轴的显示范围limits
  • 控制轴的刻度显示breaks
  • 设置轴标签的格式labels
  • 控制坐标轴两端的扩展expand
  • 调整坐标轴的刻度线方向trans

常见参数:

  1. limits

    • 用于设置 x 轴的显示范围,传入一个包含最小值和最大值的向量。如果你想要让 x 轴显示的数据范围有一点扩展,可以使用 limits 来指定显示的上下限。
    scale_x_continuous(limits = c(0, 100))  # 将 x 轴限制在 0 到 100 之间
    
  2. breaks

    • 用于控制 x 轴刻度的位置。可以传入一个数值向量或其他生成刻度位置的方法,如设置刻度为指定的几值,或使用 seq() 来创建一系列的值。
    scale_x_continuous(breaks = seq(0, 100, by = 10))  # 设置每隔 10 个单位显示一个刻度
    
  3. labels

    • 用于设置 x 轴刻度的标签。可以传入自定义标签或通过某些函数来自动生成标签。
    scale_x_continuous(labels = scales::comma)  # 格式化数字,例如将 1000 显示为 1,000
    
  4. expand

    • 控制 轴两端的扩展,通常是为了防止数据过于靠近坐标轴的边缘。expand = c(0, 0) 会去除两端的空白空间。
    scale_x_continuous(expand = c(0.05, 0))  # 让 x 轴的起点和终点各有 5% 的扩展
    
  5. trans

    • 用于指定 轴的转换函数,即对轴的数值进行转换,例如对数转换或平方根转换。
    scale_x_continuous(trans = "log10")  # 将 x 轴数据做对数转换
    
  6. oob

    • 用于指定如何处理超出 limits 范围的数据。可以选择 oob = scales::squish 来将超出范围的数值压缩到范围内,或使用 oob = scales::censor 来丢弃超出范围的数据。

示例代码:

# 加载 ggplot2
library(ggplot2)

# 创建数据
data <- data.frame(x = rnorm(100, mean = 50, sd = 10))

# 基本的 ggplot 绘图
ggplot(data, aes(x = x)) + 
  geom_histogram(binwidth = 5) + 
  scale_x_continuous(
    limits = c(30, 70),   # 设置 x 轴范围
    breaks = seq(30, 70, by = 10),  # 设置 x 轴刻度
    labels = scales::comma,  # 格式化刻度标签
    expand = c(0, 0)  # 去除两端空白
  )

其他常见组合使用:

ggplot(data, aes(x = x)) + 
  geom_histogram(binwidth = 5) + 
  scale_x_continuous(
    limits = c(40, 60), 
    breaks = seq(40, 60, by = 5), 
    labels = function(x) paste0(x, " units"),
    expand = c(0.05, 0)
  )

总结:

  • scale_x_continuous() 是 ggplot2 中控制 x 轴的可视化属性 的重要工具,可以定制刻度、范围、标签、坐标轴的缩放等属性。
  • 通过灵活地使用 limitsbreakslabels 等参数,可以使得图形的 x 轴更加符合实际需求,提高图表的可读性和表达力。
### 全连接神经网络中的反向传播公式推导全连接神经网络中,每一层的输入与输出之间存在线性关系,并通过激活函数引入非线性。对于一层来说,其正向传播可以表示为: \[ z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)} \] \[ a^{(l)} = g(z^{(l)}) \] 其中 \(W^{(l)}\) 是权重矩阵,\(b^{(l)}\) 是偏置项,\(g(\cdot)\) 表示激活函数。 为了计算梯度以便更新参数,在反向传播过程中需要计算损失函数关于各层权重偏置的偏导数。设当正在处理第 \( l \) 层,则有如下表达式用于描述这些偏导数[^1]: \[ \delta^{(l)} = (\Theta^{(l)})^T\delta^{(l+1)} .* g'(z^{(l)}) \] \[ \frac{\partial}{\partial W_{ij}^{(l)}} J(W,b;x,y)=a_j^{(l)}\delta_i^{(l+1)} \] \[ \frac{\partial}{\partial b_i^{(l)}}J(W,b;x,y)=\delta_i^{(l+1)} \] 这里 \(\delta^{(l)}\) 称作误差项(error term),代表该层相对于最终输出产生的错误;\(.*\) 表明逐元素乘法操作;\(g'\) 则是指激活函数的一阶导数。 ### 卷积神经网络(CNN)中的Backpropagation Derivation 卷积神经网络结构更加复杂一些,除了普通的全连接层外还包括卷积层、池化层等特殊组件。下面主要讨论卷积层内的反向传播过程。 假设有一个二维图像作为输入经过一次标准卷积运算得到特征图(output feature map), 正向传播可写作: \[ O(i,j,k) = f(I * K(:,:,k)) + B(k) \] 这里的 \(O, I, K,\text{ }B\) 分别对应于输出特征映射(Output Feature Map)、输入数据(Input Data)、滤波器(Filter/Kernels)以及偏差(Bias Term); 符号"\(*\)"表示卷积操作; 函数"f()"通常是一个ReLU这样的非线性变换. 当执行反向传播时,目标是要找到三个部分对应的梯度:即对输入I、核K还有bias B 的梯度。具体而言, 针对输入的数据 \(I\) 来说, \[ dI = dO * rot180(K) \] 而对于滤波器 \(K\) 而言, \[ dK = I * dO \] 最后是对于 bias \(B\), \[ dB=\sum_dO \] 上述各式中,“rot180()”指的是旋转180度的操作,这一步骤是为了匹配卷积操作的特点使得能够正确地传递梯度信息回一层节点[^2]。 另外值得注意的是,在实际应用当中可能会涉及到填充(padding)平铺(stride)等因素的影响,所以在实现具体的算法时还需要考虑这些问题带来的变化[^4]。 ```python import numpy as np def conv_backward(dZ, cache): """ Implement the backward propagation for a convolution function Arguments: dZ -- gradient of the cost with respect to output of the conv layer (Z), numpy array of shape (m, n_H, n_W, n_C) cache -- cache of values needed for the conv_backward(), output of conv_forward() Returns: dA_prev -- gradient of cost with respect to input of the conv layer (A_prev), numpy array of shape (m, n_H_prev, n_W_prev, n_C_prev) dW -- gradient of cost with respect to weights W, numpy array of shape (f, f, n_C_prev, n_C) db -- gradient of cost with respect to biases b, numpy array of shape (1, 1, 1, n_C) """ # Retrieve information from "cache" (A_prev, W, b, hparameters) = cache # Retrieve dimensions from A_prev's shape and W's shape (m, n_H_prev, n_W_prev, n_C_prev) = A_prev.shape (f, f, n_C_prev, n_C) = W.shape # Initialize gradients dA_prev = np.zeros((m, n_H_prev, n_W_prev, n_C_prev)) dW = np.zeros((f, f, n_C_prev, n_C)) db = np.sum(dZ, axis=(0, 1, 2)) db = db.reshape((1, 1, 1, n_C)) # Compute dA_prev, dW using formulas above. for i in range(m): # loop over the training examples a_slice_prev = A_prev[i,:,:,:] for h in range(n_H_prev): # loop through vertical axis of previous activation matrix for w in range(n_W_prev): # loop through horizontal axis of previous activation matrix for c in range(n_C): # loop over channels (=number of filters) of current layer vert_start = h vert_end = vert_start + f horiz_start = w horiz_end = horiz_start + f a_slice = a_slice_prev[vert_start:vert_end, horiz_start:horiz_end, :] da_prev_pad = sum(sum(np.dot(dZ[i,h,w,c], W[:,:, :,c]))) dW[:,:,:,c] += a_slice * dZ[i,h,w,c] dA_prev[i, vert_start:vert_end, horiz_start:horiz_end, :] += W[:, :, :, c]*dZ[i,h,w,c] return dA_prev, dW, db ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值