连续子数组和最大,返回子数组的开始和结束的索引

例如: a = [6,-3,-2,7,-15,1,2,2],a[0:3]的和最大为8,返回(0,3)

思路:首先,因为求和最大的连续子数组,所以子数组的第一个值不能为负;其次。如果,前面累加的和sum加上当前数值之后的和小于sum,说明当前数值不能取,如果大于或等于sum则可以继续进行。

步骤:

定义两个变量,和的最大值maxSum, 累加和sum
从S的第一个数值开始累加,如果maxSum < sum,则更新maxSum,如果sum≤0,则丢弃前面的子序列,从下一个数值重新开始累加,否则继续。
代码解析:保存求得和最大时的结束索引end,同时记录加数的个数count,如果出现之前的累加和小于0的情况,则重置count为0,继续向后加,只有当前面的累加和大于已保存的最大值时,更新end,同时更新start(end-count)

def findMaxSum(lists):
    maxSum, preSum = 0, 0
    length = len(lists)
    for i in range(0, length):
        if(preSum <= 0):
            preSum = lists[i]
            count = 0
        else:
            preSum += lists[i]
            count += 1
        if(maxSum < preSum):
            maxSum = preSum
            end = i + 1
            start = i -count
            
    return (maxSum, start, end, lists[start:end])

给定一个增序正数数组S,找出其所有子数组中和满足和为指定值target的一种情况,返回其开始和结束的索引

思路:假设数组S = [a1,a2, a3, a4, a5, a6], 且a1 < a2 < a3 < a4 < a4 < a5 < a6

Sum

lists

Sum1

S[a1]

Sum2

S[a1:a2]

Sum3

S[a1:a3]

Sum4

S[a1:a4]

Sum5

S[a1:a5]

Sum6

S[a1:a6]

注意:在求和过程中,只有单独的数字小于target时才进行

通过Sum之间的差运算即可求得S的任意子数组的和,将上述Sum存放在python的字典中,用于查找,另外讲和同时存放于一个list中,用于与给定的值target做减运算,从后往前遍历sum,用Sum-target,检查差值是否存在于字典中,如果存在则找到子数组,则返回下标,此时注意下标会比S中的下标小1,固得各加1.

def findIdx(lists, target):
    length = len(lists)
    preSum = 0
    sumLists = []
    d = {}  
    for i in range(length):
        if(target > lists[i]):
            preSum += lists[i]  #关键突破口
            if(preSum not in d):
                d[preSum] = i
                sumLists.append(preSum)
                print('sum', i, preSum)
                
    for j in sumLists[::-1]:
        rest = j - target
        print('rest1', rest, j, d[j])
        if(rest in d):
            start = d[rest]+1
            end = d[j]+1
            return start, end, lists[start:end]
    
    return False

已知:小明迟到的概率是0.4, 迟到情况下被批评的概率是0.7,没有迟到但是仍被批评的概率是0.2. 问:小明被批评时,迟到的概率

贝叶斯公式:

P(A|B) = P(AB)/P(B)
P(A∣B)=P(AB)/P(B)
解设:事件A为迟到,事件B为被批评

Python对数组部分求和_贝叶斯

Hessian Matrix

黑塞矩阵(Hessian Matrix),又译作海森矩阵、海瑟矩阵、海塞矩阵等,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。黑塞矩阵最早于19世纪由德国数学家Ludwig OttoHesse提出,并以其名字命名。黑塞矩阵常用于牛顿法解决优化问题

性质:

对称性:如果函数f在D区域内二阶可导,那么f黑塞矩阵H(f)在D内为对称矩阵。原因是:如果函数f的二阶偏导连续,则二阶偏导数的求导顺序没有区别

多元函数极值判定:如果实值多元函数f(x1, x2,…, xn)二阶连续可到,并且在临界点X(xi)(其中i=1, 2, …, n,并且xi已知)处梯度(一阶可导) 等于0,, M为驻点。仅通过一阶可导数无法判断在临界点M处是极大值还是极小值。 记f在M点处的黑塞矩阵H(M),由于f在M处连续,所以H(M)是对称矩阵,对于H(M),有如下结论:

如果H(M)是正定矩阵,则临界点M处是局部极小值

如果H(M)是负定矩阵,则临界点M处是局部极大值

如果H(M)是不定矩阵,则临界点M处没有极值

在图像处理中的应用: 结合牛顿法(1求根,2最优化)进行图像特征提取

对每个像素点计算图像在X方向Y方向的二阶偏导数,计算图像的XY方向的导数
根据第一步的计算结果,有Hessian Matrix计算D(h) = IxxIyy - IxyIxy
根据第二步计算出来的值使用3×3窗口实现非最大信号压制
在不断训练过程中,验证集和训练集的损失差距不断增大,验证集损失增加,训练集损失减小,并且从刚开始训练验证集和训练集就开始偏离,为什么?(过拟合产生的原因和预防)