输出——
{1: 'aa', 2: 'dd', 3: 'cc'} # 最后的key,2 的值'dd',刷单的之前2键的值'bb'。字典赋值,如key已在字典中,会刷新之前的值。特别注意,没有警告;不会报错。这是python 字典的特性之一。
字典赋值,如key已在字典中,会刷新之前的值。特别注意,没有警告;不会报错。这是python 字典的特性之一。
for 循环中为字典赋值的语句含义是,用列表l1的的元素依次为key,值依次为列表l2的元素。
输出的字典中的key、value对即是两个列表相同索引位置的元素。
这种情况,平时做题,手打代码,run一下就晓得结果了咯😄
#!/sur/bin/nve python
# coding: utf-8
l1 = [1, 2, 3, 2]
l2 = ['aa','bb', 'cc', 'dd', 'ee']
d = {}
for index in range(len(l1)): # 遍历列表l1的长度。
d[l1[index]] = l2[index] # 用列表l1和l2相同索引位置的元素为键值为字典d赋值。
print('\n', d) # 输出字典d。
答案就是a
{1: 'aa', 2: 'dd', 3: 'cc'}
range(4)是0 1 2 3
所以对应的d[l1[index]] = l2[index]
第一个就是d[l1[0]]=l2[0]
也就是d[1]='aa'
所以d字典的第一个元素就是1:'aa'
懂了没?
# 两个列表
l1 = [1, 2, 3, 2]
l2 = ['aa', 'bb', 'cc', 'dd', 'ee']
# 定义一个空字典
d = {}
for index in range(len(l1)):
d[l1[index]] = l2[index]
# 打印结果字典
print(d)
不知道你这个问题是否已经解决, 如果还没有解决的话:① 下降速度:
L1 就是按绝对值函数的“坡”下降的,而 L2 是按二次函数的“坡”下降。所以实际上在 0 附近,L1 的下降速度比 L2 的下降速度要快。所以会非常快得降到 0 。如下图:
② 模型空间的限制:
实际上,对于 L1 和 L2 规则化的代价函数来说,我们可以写成以下形式:
也就是说,我们将模型空间限制在 w 的一个 L1-ball 中。为了便于可视化,我们考虑两维的情况,在 ( w1 , w2 ) 平面上可以画出目标函数的等高线,而约束条件则成为平面上半径为 C 的一个 norm ball 。等高线与 norm ball 首次相交的地方就是最优解:
可以看到,L1-ball 与 L2-ball 的不同就在于 L1 在和每个坐标轴相交的地方都有“角”出现,而目标函数的测地线除非位置摆得非常好,大部分时候都会在角的地方相交。注意到在角的位置就会产生稀疏性,例如图中的相交点就有 w1=0 ,而更高维的时候除了角点以外,还有很多边的轮廓也是既有很大的概率成为第一次相交的地方,又会产生稀疏性。
相比之下,L2-ball 就没有这样的性质,因为没有角,所以第一次相交的地方出现在具有稀疏性的位置的概率就变得非常小了。这就从直观上来解释了为什么 L1-regularization 能产生稀疏性,而 L2-regularization 不行了。
总结:L1 会趋向于产生少量的特征,而其他的特征都是 0 ,而 L2 会选择更多的特征,这些特征的权重都会接近于 0 。Lasso 在特征选择时候非常有用,而 Ridge 就只是一种正则化而已。
问题解答:
首先,需要确认问题指的是哪一段代码,参考资料中提到了多个与range和l1有关的内容,因此需要明确具体是哪段代码才能回答问题。
如果代码确实涉及到了range和l1,则有可能是在使用sklearn的LogisticRegression模型进行训练时,通过penalty参数设定惩罚项为l1正则化,从而得到稀疏的权重矩阵。至于为什么len(l1)的结果不是4,那需要结合具体的代码才能得出结论。
至于range函数的输出结果为什么与预期不同,可能是使用了不同的Python版本,或者直接打印range对象的话,输出的结果确实为range(4),因此需要转换成list(range(4))后才能得到[0, 1, 2, 3]的结果。
另外,参考资料中还提到了关于数组类的问题和坐标轴下降法的问题,但这些貌似与问题本身并没有直接关系,因此不能确定是否与问题有关。