#這是我參與8月更文挑戰的第3天,活動詳情查看:8月更文挑戰算法
邏輯迴歸是在數據服從伯努利分佈的假設下,經過極大似然的方法,運用梯度降低法來求解參數,從而達到將數據二分類的目的。編程
邏輯迴歸就是一種減少預測範圍,將預測值限定爲[0,1]間的一種廣義線性迴歸模型,解決的是分類問題。數組
思路一:單指針markdown
對數組進行兩次遍歷,考慮使用單指針 ptr 進行遍歷,第一次遍歷中須要把全部的 0 交換到數組的頭部,每交換一次,ptr 向右移動一位,直到遍歷結束,此時 ptr 以前的元素都爲 0;第二次遍歷從 ptr 開始遍歷,將全部的 1 交換到中間位置,每交換一次,ptr 向後移動一位,直到遍歷結束,此時 ptr 以後(包括ptr)的元素都爲2,排序完成。多線程
代碼:函數
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
ptr = 0
for i in range(len(nums)):
if nums[i] == 0:
nums[i],nums[ptr] = nums[ptr],nums[i]
ptr +=1
for i in range(ptr,len(nums)):
if nums[i] == 1:
nums[i],nums[ptr] = nums[ptr],nums[i]
ptr +=1
return nums
複製代碼
時間複雜度:O(n),其中 nn 是數組 nums 的長度。工具
空間複雜度:O(1)。oop
思路二:雙指針post
相比單指針只須要一次遍歷便可完成。須要指針 p0 來交換等於 0 的元素,指針 p1 來交換等於 1 的元素,須要特別注意的以下:學習
先判斷元素是否等於 1,知足等於1 就進行交換,並將 p1 + 1,再判斷是否等於0 ,若是等於 0 也相應進行交換,另外須要判斷 p0 和 p1 的關係,若是知足 p0 < p1,還須要再次進行交換,完成後將 p0 和 p1 同時 +1。
代碼以下:
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
p0 = p1 = 0
for i in range(len(nums)):
if nums[i] == 1:
nums[i],nums[p1] = nums[p1],nums[i]
p1 +=1
elif nums[i] == 0:
nums[i],nums[p0] = nums[p0],nums[i]
if p0 < p1:
nums[i],nums[p1] = nums[p1],nums[i]
p0 += 1
p1 += 1
return nums
複製代碼
時間複雜度:O(n),其中 nn 是數組 nums 的長度。
空間複雜度:O(1)。
GBDT是梯度提高決策樹,是一種基於Boosting的算法,採用以決策樹爲基學習器的加法模型,經過不斷擬合上一個弱學習器的殘差,最終實現分類或迴歸的模型。關鍵在於利用損失函數的負梯度在當前模型的值做爲殘差的近似值,從而擬合一個迴歸樹。
GBDT的基分類器用的是決策樹,分類時也是用的決策樹。
對於分類問題:常使用指數損失函數;對於迴歸問題:常使用平方偏差損失函數(此時,其負梯度就是一般意義的殘差),對於通常損失函數來講就是殘差的近似。
更多請看七月在線題庫裏的這題:www.julyedu.com/questions/w…
改進主要爲如下方面:
更多請看七月在線題庫裏的這題:www.julyedu.com/questions/w…