homework1——y = w*x + b

线性模型课后作业

函数:y=w∗x+by = w*x + by=wx+b

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


# y = w*x + b
# 创建输入输出数据
x_data = np.random.randint(1, 10, size=(10))
# bias = np.random.rand(10)
bias = np.random.rand(1)
y_data = x_data * 2 + bias

print("x_data=", x_data)
print("y_data=", y_data)
print("b=", bias)


def forward(x):
    return x * w + b

def loss(y, y_pred):
    return (y_pred - y) * (y_pred - y)

w_list = []
b_list = []
mse_list = np.zeros((51,51), dtype=float)   # 创建二维array,方便后面画图

for i, w in enumerate(np.arange(0.0, 5.1, 0.1)):
    for j, b in enumerate(np.arange(-1.0, 1.04, 0.04)):
        print(f"w={w}, b={b}")
        l_sum = 0   # 每一次遍历数据集得到的loss和,初始化为0
        for x_val, y_val in zip(x_data, y_data):
            y_pred = forward(x_val)     # 预测
            loss_y = loss(y_val, y_pred)   # 计算loss
            l_sum += loss_y
            print("\t", x_val, y_val, y_pred, loss_y)
        mse_list[i][j] = l_sum / 10    # MSE
        if w==0.0:
            b_list.append(b)   # bias列表
    w_list.append(w)    # w列表


w_list, b_list = np.meshgrid(w_list, b_list)   # 创建网格
mse_list = np.array(mse_list)    # 将list转为array

print("x_data=", x_data)
print("y_data=", y_data)
print("b=", bias)


# 画图
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(w_list, b_list, mse_list)
plt.show()

<think>好的,我现在要仔细分析这段Java代码,弄清楚变量j的值到底是多少。首先,我需要逐行理解代码的执行过程,特别是涉及到自增运算符的部分,因为这里可能会有一些陷阱。 首先,代码定义了一个类Homework4,里面有一个main方法。在main方法中,声明了两个整数变量i和j,然后执行了j = i++ + ++i * i++,最后打印出j的值。我的任务就是计算出j的值,并解释这个过程。 让我先回忆一下Java中的自增运算符。自增运算符有两种形式:前缀式(++i)和后缀式(i++)。它们的区别在于,前缀式是先增加变量的值,然后返回增加后的值;而后缀式是先返回变量原来的值,然后再增加变量的值。这一点很重要,尤其是在表达式中有多个自增操作的时候,容易混淆。 现在来看具体的表达式:int j = i++ + ++i * i++; 初始时,i的值是1。这个表达式由三个部分组成:i++++i,和i++,而这三个部分被组合成一个加法运算和一个乘法运算。根据运算符的优先级,乘法(*)的优先级高于加法(+),所以应该先计算++i * i++,然后再将结果与i++相加。 不过,这里还涉及到操作数的求值顺序。在Java中,操作数的求值是从左到右进行的,即使运算符的优先级不同。例如,在表达式a + b * c中,虽然乘法先计算,但操作数a、b、c的求值顺序还是从左到右。因此,在这个问题中,i++++i、i++这三个部分的求值顺序应该是从左到右的,即先计算i++,然后是++i,最后是i++,之后再根据优先级进行运算。 现在,我需要分步骤分解这个表达式: 1. 初始i=1。 2. 表达式分解为:i++(左边) + (++i * i++)(右边)。 3. 先处理左边的i++:这里使用后缀自增,所以表达式的值是原来的i(即1),之后i自增到2。 4. 接下来处理右边的乘法部分:++i * i++。 a. 先处理++i:前缀自增,i先自增到3,然后返回3。 b. 然后处理i++:后缀自增,返回当前i的值3,之后i自增到4。 c. 所以乘法部分是3 * 3 =9。 5. 现在左边的i++的值是1,右边的乘法结果是9,所以总和是1 +9=10。 6. 最终j=10,i的值现在是4。 不过,我需要验证这个分析是否正确。可能存在的误区是在处理每个自增操作时,变量的值是否正确更新了。我需要一步一步地跟踪变量i的变化过程。 让我详细记录每个步骤后的i值: 初始i=1。 执行表达式j = i++ + ++i * i++。 首先,拆解为三个操作数:第一个i++,第二个++i,第三个i++。 按照从左到右的求值顺序: 第一个操作数是i++,此时i=1。该表达式的结果是1,之后i自增到2。 第二个操作数是++i。此时i=2,前缀自增,i变为3,表达式结果为3。 第三个操作数是i++。此时i=3,表达式结果为3,之后i自增到4。 现在,乘法部分是第二个和第三个操作数的结果相乘,即3*3=9。 然后整个表达式变为1 +9=10,所以j=10。 此时i的值是4。 不过,有没有可能我在计算过程中哪里出错了?比如,操作数的顺序或者自增的时间点? 例如,在计算乘法部分的时候,第二个操作数是++i,此时i已经是2(因为第一个i++之后i变成了2),然后执行++i,i变为3,然后第三个i++是3,之后i变成4。这似乎是对的。 或者,有没有可能,在乘法运算中,第三个i++在计算时,i的值是否已经被第二个操作数改变了? 是的,因为第二个操作数是++i,此时i已经是3了,所以第三个i++的初始值是3,然后自增到4。所以,乘法部分是3*3=9。 所以整个过程是正确的,最后j=10,i=4。 不过,为了确保正确性,我可以用另一个方式,逐步拆分每一步的中间结果: 初始i=1。 表达式:i++ + ++i * i++ 拆分成:A + B * C,其中A是i++,B是++i,C是i++。 求值顺序是从左到右,所以先求A,再求B,再求C。 求A的值:i初始为1,A的结果是1,i变为2。 接下来求B的值:此时i=2,执行++i,i变为3,B的结果是3。 接下来求C的值:此时i=3,执行i++,结果是3,i变为4。 现在计算B*C,即3*3=9,然后加上A的1,得到10。 所以j=10,i=4。 是的,这个结果正确。 不过,可能有人会有不同的理解,比如认为在乘法操作中的操作数是否按照其他顺序计算,或者运算符的优先级是否影响了求值顺序。但根据Java的规则,操作数的求值总是从左到右,不管运算符的优先级如何。所以在这个例子中,虽然乘法优先级高,但各个操作数的求值顺序是A、B、C依次进行的,之后再进行乘法和加法运算。 所以,最终的输出应该是j=10。运行这个程序的话,控制台会打印“j = 10”。</think>让我们逐步分析这段Java代码的执行过程: ```java class Homework4{ public static void main(String[] args){ int i = 1; int j = i++ + ++i * i++; System.out.println("j = " + j); // 输出结果是什么? } } ``` ### 关键分析步骤: 1. **初始值**:`i = 1` 2. **表达式分解**:`j = (i++) + (++i) * (i++)` 3. **运算符优先级**:乘法`*`优先于加法`+` 4. **求值顺序**:操作数从左到右依次计算 --- ### 逐步计算过程: 1. **计算第一个`i++`**: - 返回原始值 `1` - 此时 `i = 2`(后缀自增生效) 2. **计算`++i`**: - 先自增 `i` 到 `3` - 返回新值 `3` - 此时 `i = 3` 3. **计算第二个`i++`**: - 返回原始值 `3` - 此时 `i = 4`(后缀自增生效) 4. **计算乘积部分**: - `(++i) * (i++)` → `3 * 3 = 9` 5. **最终求和**: - `(i++) + 9` → `1 + 9 = 10` --- ### 最终结果: - **`j` 的值**:`10` - **`i` 的最终值**:`4` - **控制台输出**:`j = 10` --- ### 验证代码: 运行代码后,实际输出与理论分析完全一致。关键点在于: 1. 后缀自增(`i++`)的**延迟生效**特性 2. 前缀自增(`++i`)的**立即生效**特性 3. 操作数**从左到右**的求值顺序(即使有优先级差异)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值