/images/avatar.png

vllbc

Adaboost

Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。

反向传播算法

反向传播算法遵循两个法则:梯度下降法则和链式求导法则。

梯度下降法则不用多说,记住一切的目的就是为了减小损失,即朝着局部最小值点移动。链式求导也就是高数中学的那一套。具体地看一个推导就可以了,反向传播需要一步一步来,要搞清楚每一步在做什么。

验证曲线

通过验证曲线判定过拟合于欠拟合。

验证曲线是一种通过定位过拟合于欠拟合等诸多问题的方法,帮助提高模型性能的有效工具。

验证曲线绘制的是准确率与模型参数之间的关系。

分割等和子集

分割等和子集

题目:

https://leetcode-cn.com/problems/partition-equal-subset-sum/?utm_source=LCUS&utm_medium=ip_redirect&utm_campaign=transfer2china

思路:

典型的01背包问题,利用套路框架做即可

注意做了优化,把原本的二维dp降低了一维

代码:

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        if sum(nums) % 2:
            return False
        s = sum(nums) // 2
        dp = [False for _ in range(s+1)]
        dp[0] = True
        for i in range(1,len(nums)+1): 
            for j in range(s,nums[i-1]-1,-1): # 容量
                dp[j] = dp[j] or dp[j-nums[i-1]] # 用了or操作符
        return dp[s]

更一般的套路,定义二维数组,然后二维dp

kd树

kd树

knn算法就是用kd树实现的

二分查找

很简单 就不说了

BST

很简单 就不说了

多维数组

假设数组B为\([[6, 2], [6, 3], [3, 5], [5, 0], [1, 2], [4, 9], [8, 1]]\),有一个元素x,我们要找到数组B中距离x最近的元素,应该如何实现呢?比较直接的想法是用数组B中的每一个元素与x求距离,距离最小的那个元素就是我们要找的元素。假设x = [1, 1],那么用数组B中的所有元素与x求距离得到[5.0, 5.4, 4.5, 4.1, 1.0, 8.5, 7.0],其中距离最小的是1,对应的元素是数组B中的[1, 2],所以[1, 2]就是我们的查找结果。

最小公众前缀

最小公众前缀

leetcode上的简单题,最小公众前缀

有三种解法,一种常规,两种巧妙解法

# 最小公共前缀

#解1:常规解法 思路就是一个一个判断 先判断所有字符串第一个是否相同,不相同就返回,否则然后依次往后判断
def longestCommonPrefix1(strs):
        if len(strs) == 0:
            return ''
        if len(strs) == 1:
            return strs[0]
        minl=min([len(x) for x in strs])  #求最小长度
        end = 0
        while end < minl:   #判断是否到最小长度
            for i in range(1,len(strs)):  #以第一个字符串为基准
                if strs[i][end] != strs[i-1][end]:  #如果到end这里不再相等 则返回到end这里的字符串即最小公共前缀
                    return strs[0][:end]
            end+=1
        return strs[0][:end]
#常规方法容易想到 但是缺点是运行速度慢,从每次判断都要遍历所有字符串就可以看出

#解2: 通过ascii码来判断
#Python里字符串是可以比较的,按照ascII值排
def longestCommonPrefix2(strs):
        if not strs:
            return 0
        s1 = max(strs) 
        s2 = min(strs)
        #找出s1 s2的最小公共前缀即为整个列表的最小公共前缀
        for i,s in enumerate(s2):
            if s1[i] != s:
                return s1[:i]
        return s2
#通过max 和 min 函数来找到列表里面最大最小的两个字符串 然后找到这两个字符串的最小公共前缀。


#解3:通过python语法糖 将每个字符串的每个对应字符串存为一组,用zip函数,比如说所有的字符串第一个存在一起,然后用set去重,如果留下了一个,则说明都重复了,则就是相同的
def longestCommonPrefix3(strs):
        if not strs:
            return 0
        cc = list(map(set,zip(*strs)))  #为什么用map呢 因为要对zip压缩后的每一个序列去重
        res = ''  #结果
        for i,s in enumerate(cc):
            x = list(s)
            if len(x) > 1: #如果长度大于1 说明有不一样的 则直接退出
                break
            res += x[0]
        return res

如上!

树回归

参考:https://cuijiahua.com/blog/2017/12/ml_13_regtree_1.html

1、ID3算法的弊端

回忆一下,决策树的树构建算法是ID3。ID3的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说,如果一个特征有4种取值,那么数据将被切分成4份。一旦按某特征切分后,该特征在之后的算法执行过程中将不会再起作用,所以有观点认为这种切分方式过于迅速。

SVM_sklearn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_csv("./datasets/Social_Network_Ads.csv")
X = data.iloc[:, [2, 3]].values
y = data.iloc[:, 4].values
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)
from sklearn.svm import SVC
classifier = SVC(kernel = 'linear', random_state = 0)
classifier.fit(X_train, y_train)
SVC(kernel='linear', random_state=0)
y_pred = classifier.predict(X_test)
classifier.score(X_test,y_test)
0.88
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
from matplotlib.colors import ListedColormap
X_set, y_set = X_train, y_train
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('red', 'green')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
    plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                c = ListedColormap(('red', 'green'))(i), label = j)
plt.title('SVM (Training set)')
plt.xlabel('Age')
plt.ylabel('Estimated Salary')
plt.legend()
plt.show()