Adaboost
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
Boosting算法的工作机制是首先从训练集用初始权重训练出一个弱学习器1,根据弱学习的学习误差率表现来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。然后基于调整权重后的训练集来训练弱学习器2.,如此重复进行,直到弱学习器数达到事先指定的数目T,最终将这T个弱学习器通过集合策略进行整合,得到最终的强学习器。
反向传播算法遵循两个法则:梯度下降法则和链式求导法则。
梯度下降法则不用多说,记住一切的目的就是为了减小损失,即朝着局部最小值点移动。链式求导也就是高数中学的那一套。具体地看一个推导就可以了,反向传播需要一步一步来,要搞清楚每一步在做什么。
通过验证曲线判定过拟合于欠拟合。
验证曲线是一种通过定位过拟合于欠拟合等诸多问题的方法,帮助提高模型性能的有效工具。
验证曲线绘制的是准确率与模型参数之间的关系。
典型的01背包问题,利用套路框架做即可
注意做了优化,把原本的二维dp降低了一维
class Solution:
def canPartition(self, nums: List[int]) -> bool:
if sum(nums) % 2:
return False
= sum(nums) // 2
s = [False for _ in range(s+1)]
dp 0] = True
dp[for i in range(1,len(nums)+1):
for j in range(s,nums[i-1]-1,-1): # 容量
= dp[j] or dp[j-nums[i-1]] # 用了or操作符
dp[j] return dp[s]
更一般的套路,定义二维数组,然后二维dp
knn算法就是用kd树实现的
很简单 就不说了
很简单 就不说了
假设数组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]
=min([len(x) for x in strs]) #求最小长度
minl= 0
end while end < minl: #判断是否到最小长度
for i in range(1,len(strs)): #以第一个字符串为基准
if strs[i][end] != strs[i-1][end]: #如果到end这里不再相等 则返回到end这里的字符串即最小公共前缀
return strs[0][:end]
+=1
endreturn strs[0][:end]
#常规方法容易想到 但是缺点是运行速度慢,从每次判断都要遍历所有字符串就可以看出
#解2: 通过ascii码来判断
#Python里字符串是可以比较的,按照ascII值排
def longestCommonPrefix2(strs):
if not strs:
return 0
= max(strs)
s1 = min(strs)
s2 #找出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
= list(map(set,zip(*strs))) #为什么用map呢 因为要对zip压缩后的每一个序列去重
cc = '' #结果
res for i,s in enumerate(cc):
= list(s)
x if len(x) > 1: #如果长度大于1 说明有不一样的 则直接退出
break
+= x[0]
res return res
如上!
参考:https://cuijiahua.com/blog/2017/12/ml_13_regtree_1.html
回忆一下,决策树的树构建算法是ID3。ID3的做法是每次选取当前最佳的特征来分割数据,并按照该特征的所有可能取值来切分。也就是说,如果一个特征有4种取值,那么数据将被切分成4份。一旦按某特征切分后,该特征在之后的算法执行过程中将不会再起作用,所以有观点认为这种切分方式过于迅速。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
= pd.read_csv("./datasets/Social_Network_Ads.csv")
data = data.iloc[:, [2, 3]].values
X = data.iloc[:, 4].values y
from sklearn.model_selection import train_test_split
= train_test_split(X, y, test_size = 0.25, random_state = 0) X_train, X_test, y_train, y_test
from sklearn.preprocessing import StandardScaler
= StandardScaler()
sc = sc.fit_transform(X_train)
X_train = sc.fit_transform(X_test) X_test
from sklearn.svm import SVC
= SVC(kernel = 'linear', random_state = 0)
classifier classifier.fit(X_train, y_train)
SVC(kernel='linear', random_state=0)
= classifier.predict(X_test) y_pred
classifier.score(X_test,y_test)
0.88
from sklearn.metrics import confusion_matrix
= confusion_matrix(y_test, y_pred) cm
from matplotlib.colors import ListedColormap
= X_train, y_train
X_set, y_set = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
X1, X2 = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
np.arange(start
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),= 0.75, cmap = ListedColormap(('red', 'green')))
alpha min(), X1.max())
plt.xlim(X1.min(), X2.max())
plt.ylim(X2.for i, j in enumerate(np.unique(y_set)):
== j, 0], X_set[y_set == j, 1],
plt.scatter(X_set[y_set = ListedColormap(('red', 'green'))(i), label = j)
c 'SVM (Training set)')
plt.title('Age')
plt.xlabel('Estimated Salary')
plt.ylabel(
plt.legend() plt.show()