当前位置: 首页 > news >正文

Boosting原理代码实现

1.提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中,提升方法通过反复修改训练数据的权值分布,构建一系列基本分类器(弱分类器),并将这些基本分类器线性组合,构成一个强分类器。代表性的提升方法是AdaBoost算法。

AdaBoost模型是弱分类器的线性组合:

f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^{M} \alpha_{m} G_{m}(x) f(x)=m=1MαmGm(x)

2.AdaBoost算法的特点是通过迭代每次学习一个基本分类器。每次迭代中,提高那些被前一轮分类器错误分类数据的权值,而降低那些被正确分类的数据的权值。最后,AdaBoost将基本分类器的线性组合作为强分类器,其中给分类误差率小的基本分类器以大的权值,给分类误差率大的基本分类器以小的权值。

3.AdaBoost的训练误差分析表明,AdaBoost的每次迭代可以减少它在训练数据集上的分类误差率,这说明了它作为提升方法的有效性。

4.AdaBoost算法的一个解释是该算法实际是前向分步算法的一个实现。在这个方法里,模型是加法模型,损失函数是指数损失,算法是前向分步算法。

每一步中极小化损失函数

( β m , γ m ) = arg ⁡ min ⁡ β , γ ∑ i = 1 N L ( y i , f m − 1 ( x i ) + β b ( x i ; γ ) ) \left(\beta_{m}, \gamma_{m}\right)=\arg \min _{\beta, \gamma} \sum_{i=1}^{N} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+\beta b\left(x_{i} ; \gamma\right)\right) (βm,γm)=argβ,γmini=1NL(yi,fm1(xi)+βb(xi;γ))

得到参数 β m , γ m \beta_{m}, \gamma_{m} βm,γm

5.提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中最有效的方法之一。

1 袋装(bagging)提升(boosting)的区别

袋装 ( B a g g i n g ) (Bagging) (Bagging)和提升 ( B o o s t i n g ) (Boosting) (Boosting)是两种常见的集成学习方法,它们通过结合多个基模型来提高模型的性能。尽管它们的目标相似,但在具体实现和策略上有显著的区别。

  • 袋装 ( b a g g i n g ) (bagging) (bagging)是 Bootstrap Aggregating 的简称,它通过在训练集中进行有放回的随机抽样生成多个不同的子集,然后在这些子集上训练多个基模型(通常是同一类型的模型,如决策树),最后将这些基模型的预测结果进行平均(回归问题)或投票(分类问题)。
  • 提升 ( b o o s t i n g ) (boosting) (boosting)通过逐步训练基模型,每个基模型都试图修正前一个基模型的错误。每一轮训练中,错误分类的样本会被赋予更高的权重,以便下一轮训练能够更好地处理这些难以分类的样本。

2 AdaBoost

AdaBoost是AdaptiveBoost的缩写,表明该算法是具有适应性的提升算法。

算法的步骤如下:

1)给每个训练样本( x 1 , x 2 , … . , x N x_{1},x_{2},….,x_{N} x1,x2,.,xN)分配权重,初始权重 w 1 w_{1} w1均为 1 / N 1/N 1/N

2)针对带有权值的样本进行训练,得到模型 G m G_m Gm(初始模型为 G 1 G1 G1)。

3)计算模型 G m G_m Gm的误分率 e m = ∑ i = 1 N w i I ( y i ≠ G m ( x i ) ) e_m=\sum_{i=1}^Nw_iI(y_i\not= G_m(x_i)) em=i=1NwiI(yi=Gm(xi))

4)计算模型 G m G_m Gm的系数 α m = 0.5 log ⁡ [ ( 1 − e m ) / e m ] \alpha_m=0.5\log[(1-e_m)/e_m] αm=0.5log[(1em)/em]

5)根据误分率 e e e和当前权重向量 w m w_m wm更新权重向量 w m + 1 w_{m+1} wm+1

6)计算组合模型 f ( x ) = ∑ m = 1 M α m G m ( x i ) f(x)=\sum_{m=1}^M\alpha_mG_m(x_i) f(x)=m=1MαmGm(xi)的误分率。

7)当组合模型的误分率或迭代次数低于一定阈值,停止迭代;否则,回到步骤 2)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from matplotlib_inline import backend_inlinebackend_inline.set_matplotlib_formats('svg')
# data
def create_data():iris = load_iris()df = pd.DataFrame(iris.data)df['label'] = iris.targetdf.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label']data = np.array(df.iloc[:100, [0, 1, -1]])for i in range(len(data)):if data[i, -1] == 0:data[i, -1] = -1#     print(data)return data[:, :2], data[:, -1]
X,y = create_data()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, random_state = 2)
plt.scatter(X[:50, 0], X[:50, 1], label='0')
plt.scatter(X[50:, 0], X[50:, 1], label='1')
plt.legend()
plt.show()

在这里插入图片描述

2.1 Adaboost代码实现(二分类)

class AdaBoost:def __init__(self, n_estimators=50, learning_rate=1.0):self.clf_num = n_estimatorsself.learning_rate = learning_ratedef init_args(self, datasets, labels):self.X = datasetsself.Y = labelsself.M, self.N = datasets.shape# 弱分类器数目和集合self.clf_sets = []# 初始化weightsself.weights = [1.0 / self.M] * self.M# G(x)系数 alphaself.alpha = []# 实现单一弱分类器def _G(self, features, labels, weights):m = len(features)  # 样本数量error = 100000.0  # 无穷大best_v = 0.0# 单维featuresfeatures_min = min(features)  # 这列特征最小的值features_max = max(features)  # 这列特征最大的值n_step = (features_max - features_min +self.learning_rate) // self.learning_rate# print('n_step:{}'.format(n_step))current_direct, compare_array,best_direct = None, None,None# 遍历所有可能的阈值 v,以找到最佳的分类阈值。# 对每个阈值,计算正向和负向分类器的加权分类误差。# 选择误差较小的分类器,并更新最优分类器的阈值和分类结果for i in range(1, int(n_step)):v = features_min + self.learning_rate * i# 避免在已有特征值上进行分割if v not in features:# 误分类计算:特征值大于阈值 v,则分类为 1,否则分类为 -1compare_array_positive = np.array([1 if features[k] > v else -1 for k in range(m)])# 使用正向分类器时的加权分类误差,计算分类结果与标签不一致的样本权重之和weight_error_positive = sum([weights[k] for k in range(m)if compare_array_positive[k] != labels[k]])compare_array_nagetive = np.array([-1 if features[k] > v else 1 for k in range(m)])weight_error_nagetive = sum([weights[k] for k in range(m)if compare_array_nagetive[k] != labels[k]])# 比较正向和负向分类器的误差,选择误差较小的分类器,并记录相应的分类结果数组 _compare_array 和分类方向if weight_error_positive < weight_error_nagetive:weight_error = weight_error_positive_compare_array = compare_array_positivecurrent_direct = 'positive'else:weight_error = weight_error_nagetive_compare_array = compare_array_nagetivecurrent_direct = 'nagetive'# print('v:{} error:{}'.format(v, weight_error))if weight_error < error:error = weight_errorcompare_array = _compare_arraybest_v = vbest_direct = current_directreturn best_v, best_direct, error, compare_array# 计算alphadef _alpha(self, error):return 0.5 * np.log((1 - error) / error)# 规范化因子def _Z(self, weights, a, clf):return sum([weights[i] * np.exp(-1 * a * self.Y[i] * clf[i])for i in range(self.M)])# 权值更新def _w(self, a, clf, Z):for i in range(self.M):self.weights[i] = self.weights[i] * np.exp(-1 * a * self.Y[i] * clf[i]) / Z# G(x)的线性组合def _f(self, alpha, clf_sets):passdef G(self, x, v, direct):if direct == 'positive':return 1 if x > v else -1else:return -1 if x > v else 1def fit(self, X, y):self.init_args(X, y)# 每轮迭代中,找到误差最小的弱分类器,计算其权重,并更新样本权重for epoch in range(self.clf_num):best_clf_error, best_v, clf_result, final_direct = 100000, None, None, None# 根据特征维度, 选择误差最小的维度for j in range(self.N):features = self.X[:, j]# 分类阈值,分类方向,分类误差,分类结果v, direct, error, compare_array = self._G(features, self.Y, self.weights)if error < best_clf_error:best_clf_error = errorbest_v = vfinal_direct = directclf_result = compare_arrayaxis = j# print('epoch:{}/{} feature:{} error:{} v:{}'.format(epoch, self.clf_num, j, error, best_v))if best_clf_error == 0:break# 计算G(x)系数aa = self._alpha(best_clf_error)self.alpha.append(a)# 记录分类器self.clf_sets.append((axis, best_v, a,final_direct))# 规范化因子Z = self._Z(self.weights, a, clf_result)# 权值更新self._w(a, clf_result, Z)#             print('classifier:{}/{} error:{:.3f} v:{} direct:{} a:{:.5f}'.format(epoch+1, self.clf_num, error, best_v, final_direct, a))
#             print('weight:{}'.format(self.weights))
#             print('\n')def predict(self, feature):result = 0.0for i in range(len(self.clf_sets)):axis, clf_v, _a, direct = self.clf_sets[i]f_input = feature[axis]result += self.alpha[i] * self.G(f_input, clf_v, direct)# signreturn 1 if result > 0 else -1def score(self, X_test, y_test):right_count = 0for i in range(len(X_test)):feature = X_test[i]if self.predict(feature) == y_test[i]:right_count += 1return right_count / len(X_test)

2.2 例题8.1

X = np.arange(10).reshape(10, 1)
y = np.array([1, 1, 1, -1, -1, -1, 1, 1, 1, -1])
clf = AdaBoost(n_estimators=3, learning_rate=0.5)
clf.fit(X, y)
clf.clf_sets
[(0, 2.5, 0.4236489301936017, 'nagetive'),(0, 8.5, 0.6496414920651304, 'nagetive'),(0, 5.5, 0.752038698388137, 'positive')]
clf = AdaBoost(n_estimators=10, learning_rate=0.2)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
0.8666666666666667
# 50次结果
result = []
for i in range(1, 51):X, y = create_data()X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)clf = AdaBoost(n_estimators=100, learning_rate=0.2)clf.fit(X_train, y_train)r = clf.score(X_test, y_test)# print('{}/100 score:{}'.format(i, r))result.append(r)print('average score:{:.3f}'.format(np.mean(result)))
average score:0.839

2.3 sklearn.ensemble.AdaBoostClassifier

  • a l g o r i t h m algorithm algorithm:这个参数只有AdaBoostClassifier有。主要原因是scikit-learn实现了两种Adaboost分类算法,SAMME和SAMME.R。两者的主要区别是弱学习器权重的度量,SAMME使用了和原理篇里二元分类Adaboost算法的扩展,即用对样本集分类效果作为弱学习器权重,而SAMME.R使用了对样本集分类的预测概率大小来作为弱学习器权重。由于SAMME.R使用了概率度量的连续值,迭代一般比SAMME快,因此AdaBoostClassifier的默认算法algorithm的值也是SAMME.R。我们一般使用默认的SAMME.R就够了,但是要注意的是使用了SAMME.R, 则弱分类学习器参数base_estimator必须限制使用支持概率预测的分类器。SAMME算法则没有这个限制。

  • n _ e s t i m a t o r s n\_estimators n_estimators:AdaBoostClassifier和AdaBoostRegressor都有,就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是50。在实际调参的过程中,常常将n_estimators和下面介绍的参数learning_rate一起考虑。

  • l e a r n i n g _ r a t e learning\_rate learning_rate:AdaBoostClassifier和AdaBoostRegressor都有,即每个弱学习器的权重缩减系数 ν ν ν

  • b a s e _ e s t i m a t o r base\_estimator base_estimator:AdaBoostClassifier和AdaBoostRegressor都有,即弱分类学习器或者弱回归学习器。理论上可以选择任何一个分类或者回归学习器,不过需要支持样本权重。常用的一般是CART决策树或者神经网络MLP。

  • r a n d o m _ s t a t e random\_state random_state:整数、随机数生成器实例或 None,默认为 None。用于控制随机数生成,以便结果可重现。

from sklearn.ensemble import AdaBoostClassifierclf = AdaBoostClassifier(n_estimators=100, learning_rate=0.5)
clf.fit(X_train, y_train)
clf.score(X_test, y_test)
0.9
2.3.1 sklearn完整示例
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoreiris = load_iris()
X, y = iris.data, iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 初始化 AdaBoost 分类器
# 使用默认的决策树分类器作为弱学习器
clf = AdaBoostClassifier(n_estimators=50, learning_rate=1.0, random_state=42)
clf.fit(X_train, y_train)y_pred = clf.predict(X_test)accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")# 查看模型的弱学习器
print(f"Number of weak learners: {len(clf.estimators_)}")
Accuracy: 1.00
Number of weak learners: 50
  • b a s e _ e s t i m a t o r base\_estimator base_estimator:可以自定义弱学习器,例如,使用深度为 2 的决策树:
base_clf = DecisionTreeClassifier(max_depth=2)
clf = AdaBoostClassifier(base_estimator=base_clf, n_estimators=50, learning_rate=1.0, random_state=42)

3 第八章的课后习题

8.1 某公司招聘职员考查身体、业务能力、发展潜力这3项。身体分为合格1、不合格0两级,业务能力和发展潜力分为上1、中2、下3三级分类为合格1 、不合格-1两类。已知10个人的数据,如下表所示。假设弱分类器为决策树桩。试用AdaBoost算法学习一个强分类器。

应聘人员情况数据表

  12345678910
身体0011101110
业务1321211132
潜力3123322111
分类-1-1-1-1-1-111-1-1
import numpy as np# 加载训练数据
X = np.array([[0, 1, 3], [0, 3, 1], [1, 2, 2], [1, 1, 3], [1, 2, 3], [0, 1, 2],[1, 1, 2], [1, 1, 1], [1, 3, 1], [0, 2, 1]])
y = np.array([-1, -1, -1, -1, -1, -1, 1, 1, -1, -1])

AdaBoostClassifier分类器实现:

采用sklearn的AdaBoostClassifier分类器直接求解,由于AdaBoostClassifier分类器默认采用CART决策树弱分类器,故不需要设置base_estimator参数。

from sklearn.ensemble import AdaBoostClassifierclf = AdaBoostClassifier()
clf.fit(X, y)
y_predict = clf.predict(X)
score = clf.score(X, y)
print("原始输出:", y)
print("预测输出:", y_predict)
print("预测正确率:{:.2%}".format(score))
原始输出: [-1 -1 -1 -1 -1 -1  1  1 -1 -1]
预测输出: [-1 -1 -1 -1 -1 -1  1  1 -1 -1]
预测正确率:100.00%

自编程实现

# 自编程求解习题8.1
import numpy as npclass AdaBoost:def __init__(self, X, y, tol=0.05, max_iter=10):# 训练数据 实例self.X = X# 训练数据 标签self.y = y# 训练中止条件 right_rate>self.tolself.tol = tol# 最大迭代次数self.max_iter = max_iter# 初始化样本权重wself.w = np.full((X.shape[0]), 1 / X.shape[0])self.G = []  # 弱分类器def build_stump(self):"""以带权重的分类误差最小为目标,选择最佳分类阈值best_stump['dim'] 合适的特征所在维度best_stump['thresh']  合适特征的阈值best_stump['ineq']  树桩分类的标识lt,rt"""m, n = np.shape(self.X)# 分类误差e_min = np.inf# 小于分类阈值的样本属于的标签类别sign = None# 最优分类树桩best_stump = {}for i in range(n):range_min = self.X[:, i].min()  # 求每一种特征的最大最小值range_max = self.X[:, i].max()step_size = (range_max - range_min) / nfor j in range(-1, int(n) + 1):thresh_val = range_min + j * step_size# 计算左子树和右子树的误差for inequal in ['lt', 'rt']:predict_vals = self.base_estimator(self.X, i, thresh_val,inequal)err_arr = np.array(np.ones(m))err_arr[predict_vals.T == self.y.T] = 0weighted_error = np.dot(self.w, err_arr)if weighted_error < e_min:e_min = weighted_errorsign = predict_valsbest_stump['dim'] = ibest_stump['thresh'] = thresh_valbest_stump['ineq'] = inequalreturn best_stump, sign, e_mindef updata_w(self, alpha, predict):"""更新样本权重w"""# 以下2行根据公式8.4 8.5 更新样本权重P = self.w * np.exp(-alpha * self.y * predict)self.w = P / P.sum()@staticmethoddef base_estimator(X, dimen, threshVal, threshIneq):"""计算单个弱分类器(决策树桩)预测输出"""ret_array = np.ones(np.shape(X)[0])  # 预测矩阵# 左叶子 ,整个矩阵的样本进行比较赋值if threshIneq == 'lt':ret_array[X[:, dimen] <= threshVal] = -1.0else:ret_array[X[:, dimen] > threshVal] = -1.0return ret_arraydef fit(self):"""对训练数据进行学习"""G = 0for i in range(self.max_iter):best_stump, sign, error = self.build_stump()  # 获取当前迭代最佳分类阈值alpha = 1 / 2 * np.log((1 - error) / error)  # 计算本轮弱分类器的系数# 弱分类器权重best_stump['alpha'] = alpha# 保存弱分类器self.G.append(best_stump)# 以下3行计算当前总分类器(之前所有弱分类器加权和)分类效率G += alpha * signy_predict = np.sign(G)error_rate = np.sum(np.abs(y_predict - self.y)) / 2 / self.y.shape[0]if error_rate < self.tol:  # 满足中止条件 则跳出循环print("迭代次数:", i + 1)breakelse:self.updata_w(alpha, y_predict)  # 若不满足,更新权重,继续迭代def predict(self, X):"""对新数据进行预测"""m = np.shape(X)[0]G = np.zeros(m)for i in range(len(self.G)):stump = self.G[i]# 遍历每一个弱分类器,进行加权_G = self.base_estimator(X, stump['dim'], stump['thresh'],stump['ineq'])alpha = stump['alpha']G += alpha * _Gy_predict = np.sign(G)return y_predict.astype(int)def score(self, X, y):"""对训练效果进行评价"""y_predict = self.predict(X)error_rate = np.sum(np.abs(y_predict - y)) / 2 / y.shape[0]return 1 - error_rate
clf = AdaBoost(X, y)
clf.fit()
y_predict = clf.predict(X)
score = clf.score(X, y)
print("原始输出:", y)
print("预测输出:", y_predict)
print("预测正确率:{:.2%}".format(score))
迭代次数: 8
原始输出: [-1 -1 -1 -1 -1 -1  1  1 -1 -1]
预测输出: [-1 -1 -1 -1 -1 -1  1  1 -1 -1]
预测正确率:100.00%

习题8.2 比较支持向量机、 AdaBoost 、Logistic回归模型的学习策略与算法

解答:

  • 支持向量机
    学习策略:极小化正则化合页损失,软间隔最大化;
    学习算法:序列最小最优化算法(SMO)
  • AdaBoost
    学习策略:极小化加法模型指数损失;
    学习算法:前向分步加法算法
  • Logistic回归
    学习策略:极大似然估计,正则化的极大似然估计;
    学习算法:改进的迭代尺度算法,梯度下降,拟牛顿法

4 一个例子:随机森林、Logistic回归、SVM、AdaBoost

  1. 使用 m a k e _ c l a s s i f i c a t i o n make\_classification make_classification 数据集生成一个带有 1000 个样本和 20 个特征的二分类数据集,其中有 15 个信息特征和 5 个冗余特征

  2. 使用随机森林、逻辑回归、SVM 和 AdaBoost 进行分类

  3. 绘制四个模型的 ROC 曲线,并计算和标出对应的 AUC 值

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.metrics import roc_curve, auc# 生成数据集
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=42)# 添加噪声
np.random.seed(42)
noise = np.random.normal(0, 0.1, X.shape)
X += noise# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 定义分类器
classifiers = {"Random Forest": RandomForestClassifier(n_estimators=100, random_state=42),"Logistic Regression": LogisticRegression(max_iter=1000, random_state=42),"SVM": SVC(probability=True, random_state=42),"AdaBoost": AdaBoostClassifier(n_estimators=100, random_state=42)
}# 训练分类器并计算 ROC 曲线和 AUC 值
plt.figure(figsize=(8, 5))
for name, clf in classifiers.items():clf.fit(X_train, y_train)y_score = clf.predict_proba(X_test)[:, 1]fpr, tpr, _ = roc_curve(y_test, y_score)roc_auc = auc(fpr, tpr)plt.plot(fpr, tpr, lw=2, label=f'{name} (AUC = {roc_auc:.2f})')# 绘制 ROC 曲线
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([-0.02, 1.02])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc="lower right")
plt.show()

在这里插入图片描述

代码来自:https://github.com/fengdu78/lihang-code
参考书籍:李航《机器学习方法》

相关文章:

Boosting原理代码实现

1&#xff0e;提升方法是将弱学习算法提升为强学习算法的统计学习方法。在分类学习中&#xff0c;提升方法通过反复修改训练数据的权值分布&#xff0c;构建一系列基本分类器&#xff08;弱分类器&#xff09;&#xff0c;并将这些基本分类器线性组合&#xff0c;构成一个强分类…...

【Qt基础教程】事件

文章目录 前言事件简介事件示例总结 前言 在开发复杂的图形用户界面(GUI)应用程序时&#xff0c;理解和掌握事件处理是至关重要的。Qt&#xff0c;作为一个强大的跨平台应用程序开发框架&#xff0c;提供了一套完整的事件处理系统。本教程旨在介绍Qt事件处理的基础知识&#x…...

外星人Alienware m15R7 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…...

stata17中java installation not found或java not recognozed的问题

此问题在于stata不知道去哪里找java,因此需要手动的告诉他 方法1&#xff1a; 1.你得保证已经安装并配置好java环境 2.在stata中输入以下内容并重启stata即可 set java_home "D:\Develope\JDk17" 其中java_home后面的""里面的内容是你的jdk安装路径 我的…...

Harbor本地仓库搭建003_Harbor常见错误解决_以及各功能使用介绍_镜像推送和拉取---分布式云原生部署架构搭建003

首先我们去登录一下harbor,但是可以看到,用户名密码没有错,但是登录不上去 是因为,我们用了负债均衡,nginx会把,负载均衡进行,随机分配,访问的 是harbora,还是harborb机器. loadbalancer中 解决方案,去loadbalance那个机器中,然后 这里就是25机器,我们登录25机器 然后去配置…...

怎样搭建serveru ftp个人服务器

首先说说什么是ftp&#xff1f; FTP协议是专门针对在两个系统之间传输大的文件这种应用开发出来的&#xff0c;它是TCP/IP协议的一部分。FTP的意思就是文件传输协议&#xff0c;用来管理TCP/IP网络上大型文件的快速传输。FTP早也是在Unix上开发出来的&#xff0c;并且很长一段…...

SEO是什么?SEO相关发展历史

一、SEO是什么意思&#xff1f; SEO&#xff08;Search Engine Optimization&#xff09;&#xff0c;翻译成中文就是“搜索引擎优化”。简单来讲&#xff0c;seo是指自然搜索结果下获得的网站流量的技术&#xff0c;是可以不用花钱就可以让自己的网站有好的排名&#xff0c;也…...

android之WindowManager悬浮框

文章目录 阐述悬浮框的实现AndroidManifest配置使用方法 阐述 Window的类型大致分为三种&#xff1a; Application Window 应用程序窗口、Sub Window 子窗口、System Window 系统窗口 窗口类型图层值&#xff08;type&#xff09;Application Window1&#xff5e;99Sub Windo…...

注解详解系列 - @Scope:定义Bean的作用范围

注解简介 在今天的注解详解系列中&#xff0c;我们将探讨Scope注解。Scope是Spring框架中的一个重要注解&#xff0c;用于定义bean的作用范围。通过Scope注解&#xff0c;可以控制Spring容器中bean的生命周期和实例化方式。 注解定义 Scope注解用于定义Spring bean的作用范围…...

仿中波本振电路的LC振荡器电路实验

手里正好有一套中波收音机套件的中周。用它来测试一下LC振荡器&#xff0c;电路如下&#xff1a; 用的是两只中频放大的中周&#xff0c;初步测试是用的中周自带的瓷管电容&#xff0c;他们应该都是谐振在465k附近。后续测试再更换电容测试。 静态电流&#xff0c;0.5到1mA。下…...

Java 面试题:谈谈 final、finally、 finalize 有什么不同?

在 Java 编程中&#xff0c;final、finally 和 finalize 是三个看似相似但用途截然不同的关键字和方法。理解它们的区别对于编写高质量和健壮的代码至关重要。 final 关键字可用于声明常量、方法和类。用在变量上表示变量不可变&#xff0c;用在方法上表示方法不能被重写&#…...

45、基于深度学习的螃蟹性别分类(matlab)

1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别&#xff0c;从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备&#xff1a; 首先需要收集包…...

mongodb嵌套聚合

db.order.aggregate([{$match: {// 下单时间"createTime": {$gte: ISODate("2024-05-01T00:00:00Z"),$lte: ISODate("2024-05-31T23:59:59Z")}// 商品名称,"goods.productName": /美国皓齿/,//订单状态 2:待发货 3:已发货 4:交易成功…...

在 KubeSphere 上快速安装和使用 KDP 云原生数据平台

作者简介&#xff1a;金津&#xff0c;智领云高级研发经理&#xff0c;华中科技大学计算机系硕士。加入智领云 8 余年&#xff0c;长期从事云原生、容器化编排领域研发工作&#xff0c;主导了智领云自研的 BDOS 应用云平台、云原生大数据平台 KDP 等产品的开发&#xff0c;并在…...

Dev Eco Studio设置中文界面

Settings-Plugins-installed-搜索Chinese...

vscode作为markdown LaTeX编辑器

1、安装插件 Markdown All in One 2、下载并安装 prince&#xff1a;Prince - Latest builds Deepin 20.9 对应 debian 10&#xff0c;下载 debian 10 的deb包安装即可 &#xff08;安装后命令在 /usr/bin 下&#xff09; 3、安装插件 Markdown Preview Enhanced&#xff…...

Java中的图形用户界面开发

Java中的图形用户界面开发 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今软件开发的世界中&#xff0c;图形用户界面&#xff08;Graphical User Inte…...

android常用知识

透明activity样式&#xff1a; android:theme"android:style/Theme.Translucent.NoTitleBar.Fullscreen"这句代码&#xff0c;当你是建的empty activity project时&#xff0c;默认继承的是AppCompat这个类。所以在AndroidMifext.xml文件中用上述代码会导致程序错误&…...

centos中安装并设置vsftpd

vsftpd是一个可安装在linux上的ftp服务器软件。 一、安装 安装前保证服务器能上互联网。如果不能上网&#xff0c;看看能不能设法利用局域网代理上网。 sudo yum -y install vsftpd二、配置 1、修改配置文件 cd /etc/vsftpd #修改之前记得备份&#xff01;&#xff01;&am…...

C语言入门系列:指针入门(超详细)

文章目录 一&#xff0c;什么是指针1&#xff0c;内存2&#xff0c;指针是什么&#xff1f; 二&#xff0c;指针的声明1&#xff0c;声明指针类型变量2&#xff0c;二级指针 三&#xff0c;指针的计算1&#xff0c;两个指针运算符1.1 *运算符1.2 & 运算符1.3 &运算符与…...

打印水仙花数

题目&#xff1a;打印出所有的“水仙花数”&#xff0c;所谓“水仙花数”是指一个三位数&#xff0c;其各位数字立方和等于该数本身。 例如&#xff1a;153是一个“水仙花数”&#xff0c;因为153 1的三次方 &#xff0b;5的三次方&#xff0b;3的三次方。 程序分析&#xff…...

【SCAU数据挖掘】数据挖掘期末总复习题库简答题及解析——下

1.从某超市顾客中随机抽取5名&#xff0c;他们的购物篮数据的二元0/1表示如下&#xff1a; 顾客号 面包 牛奶 尿布 啤酒 鸡蛋 可乐 1 1 1 0 0 0 0 2 1 0 1 1 1 0 3 0 1 1 1 0 1 4 1 1 1 1 0 0 5 1 1 1 0 0 1 某学生依据这些数据做…...

PyQt学习之简介

1.Python图形界面称为程序的用户交互界面&#xff0c;英文称之为 UI (user interface) Tkinter 基于Tk的Python库&#xff0c;Python官方采用的标准库&#xff0c;优点是作为Python标准库、稳定、发布程序较小&#xff0c;缺点是控件相对较少。 wxPython 基于wxWidgets的Py…...

深入理解前端缓存

前端缓存是所有前端程序员在成长历程中必须要面临的问题&#xff0c;它会让我们的项目得到非常大的优化提升&#xff0c;同样也会带来一些其它方面的困扰。大部分前端程序员也了解一些缓存相关的知识&#xff0c;比如&#xff1a;强缓存、协商缓存、cookie等&#xff0c;但是我…...

K-means聚类算法详解与实战

一、引言 K-means聚类算法是一种无监督学习算法&#xff0c;旨在将数据点划分为K个不同的聚类或群组&#xff0c;使得同一聚类内的数据点尽可能相似&#xff0c;而不同聚类间的数据点尽可能不同。在图像处理、数据挖掘、客户细分等领域有着广泛的应用。本文将通过图文结合的方…...

python数据分析-糖尿病数据集数据分析预测

一、研究背景和意义 糖尿病是美国最普遍的慢性病之一&#xff0c;每年影响数百万美国人&#xff0c;并对经济造成重大的经济负担。糖尿病是一种严重的慢性疾病&#xff0c;其中个体失去有效调节血液中葡萄糖水平的能力&#xff0c;并可能导致生活质量和预期寿命下降。。。。 …...

【前端】 nvm安装管理多版本node、 npm install失败解决方式

【问题】If you believe this might be a permissions issue, please double-check the npm ERR! permissio或者Error: EPERM: operation not permitted, VScode中npm install或cnpm install报错 简单总结&#xff0c;我们运行npm install 无法安装吧包&#xff0c;提示权限问题…...

第11天:API开发与REST framework

第11天&#xff1a;API开发与REST framework 目标 使用Django REST framework构建RESTful API。 任务概览 学习序列化器的概念和使用方法。创建API视图和路由。实现API的权限和认证。 详细步骤 1. 学习序列化器 序列化器是Django REST framework中用于数据转换的组件&am…...

2024 年解锁 Android 手机的 7 种简便方法

您是否忘记了 Android 手机的 Android 锁屏密码&#xff0c;并且您的手机已被锁定&#xff1f;您需要使用锁屏解锁 Android 手机&#xff1f;别担心&#xff0c;您不是唯一一个忘记密码的人。我将向您展示如何解锁 Android 手机的锁屏。 密码 PIN 可保护您的 Android 手机和 G…...

利用机器学习重构视频中的人脸

引言 中国与英国的研究团队携手合作&#xff0c;开创了一种创新的视频面孔重塑技术。这项技术能够以极高的一致性对视频中的面部结构进行逼真的放大和缩小&#xff0c;且避免了常见伪影的产生。 从研究人员选取的YouTube视频样例中可见&#xff0c;经过处理后&#xff0c;女演…...

2021数学建模C题目– 生产企业原材料的订购与运输

C 题——生产企业原材料的订购与运输 思路&#xff1a;该题主要是通过对供应商的供货能力和运送商的运货能力进行估计&#xff0c;给出合适的材料订购方案 程序获取 第一题问题思路与结果&#xff1a; 对 402 家供应商的供货特征进行量化分析&#xff0c;建立反映保障企业生…...

C# OpenCvSharp 图像复制-clone、copyTo

在C#中使用OpenCvSharp库处理图像时&#xff0c;clone和copyTo是两个非常常用的函数。理解和合理使用这些函数可以帮助你在图像处理项目中更高效地操作图像数据。本文将详细介绍这两个函数的使用方法&#xff0c;并通过具体的示例来说明它们的实际应用。 1. clone 函数 定义 …...

中国投入到终止遗传性疾病的战斗

中国投入到终止遗传性疾病的战斗 编译 李升伟 于2006年6月在澳大利亚的墨尔本会议上启动的人类变异组计划&#xff08;Human Variome Project&#xff0c;简称HVP&#xff09;&#xff0c;旨在全球范围内广泛收集所有基因和蛋白质序列变异和多态性的数据&#xff0c;采用全基…...

PCL common中常见的基础功能函数

文章目录 一、common模块中的头文件二、common模块中的基本函数1、angles.h2、centroid.h1)计算给定一群点的3D中心点,并且返回一个三维向量2)计算给定的三维点云的协方差矩阵。3)计算正则化的3*3的协方差矩阵以及给定点云数据的中心点4)利用一组点的指数对其进行一般的、…...

力扣每日一题 6/22 字符串/贪心

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2663.字典序最小的美丽字符串【困难】 题目&#xff1a; 如果一个字符串满…...

MCT Self-Refine:创新集成蒙特卡洛树搜索 (MCTS)提高复杂数学推理任务的性能,超GPT4,使用 LLaMa-3 8B 进行自我优化

&#x1f4dc; 文献卡 题目&#xff1a; Accessing GPT-4 level Mathematical Olympiad Solutions via Monte Carlo Tree Self-refine with LLaMa-3 8B作者: Di Zhang; Xiaoshui Huang; Dongzhan Zhou; Yuqiang Li; Wanli OuyangDOI: 10.48550/arXiv.2406.07394摘要: This pape…...

自制HTML5游戏《开心消消乐》

1. 引言 游戏介绍 《开心消消乐》是一款基于HTML5技术开发的网页游戏&#xff0c;以其简单的操作方式、轻松的游戏体验和高度的互动性&#xff0c;迅速在社交平台上获得了广泛的关注和传播。玩家通过消除相同类型的元素来获得分数&#xff0c;游戏设计巧妙&#xff0c;易于上手…...

【C++】平衡二叉树(AVL树)的实现

目录 一、AVL树的概念二、AVL树的实现1、AVL树的定义2. 平衡二叉树的插入2.1 按照二叉排序树的方式插入并更新平衡因子2.2 AVL树的旋转2.2.1 新节点插入较高左子树的左侧&#xff08;LL平衡旋转&#xff09;2.2.2 新节点插入较高右子树的右侧&#xff08;RR平衡旋转&#xff09…...

第一百一十八节 Java面向对象设计 - Java接口

Java面向对象设计 - Java接口 什么是接口&#xff1f; Java中的接口定义了一个引用类型来创建抽象概念。接口由类实现以提供概念的实现。 在Java 8之前&#xff0c;一个接口只能包含抽象方法。 Java 8允许接口具有实现的静态和默认方法。 接口通过抽象概念定义不相关类之间…...

Flink nc -l -p 监听端口测试

1、9999端口未占用 netstat -apn|grep 99992、消息发送端 nc -l -k -p 9999 {"user":"ming","url":"www.baidu1.com", "timestamp":1200L, "score":1} {"user":"xiaohu","url":…...

在IntelliJ IDEA中使用Spring Boot:快速配置

使用IntelliJ IDEA开发Spring Boot应用程序可以极大地提高开发效率&#xff0c;因为IDEA提供了许多便捷的功能&#xff0c;比如自动补全、代码分析、热部署等。以下是一篇可能的CSDN博客文章草稿&#xff0c;介绍如何在IntelliJ IDEA中使用Spring Boot&#xff1a; 在IntelliJ …...

django filter 批量修改

django filter 批量修改 在Django中&#xff0c;如果你想要批量修改记录&#xff0c;可以使用update()方法。这个方法允许你在一个查询集上执行批量更新&#xff0c;而不需要为每条记录生成单独的数据库事务。 以下是一个使用update()方法批量修改记录的例子&#xff1a; fro…...

maven:中央仓库验证方式改变:401 Content access is protected by token

前几天向maven中央仓库发布版本&#xff0c;执行上传命令mvn release:perform时报错了&#xff1a; [ERROR] Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin:1.6.13:deploy (injected-nexus-deploy) on project xxxxx: Failed to deploy artifacts: …...

【面试】http

一、定义 HTTP&#xff08;超文本传输协议&#xff09;&#xff0c;是一种用于分布式、协作式、超媒体信息系统的应用层协议&#xff0c;它是万维网数据通信的基础。主要特点是无状态&#xff08;服务器不会保存之前请求的状态&#xff09;、无连接&#xff08;服务器处理完请…...

获取泛型,泛型擦除,TypeReference 原理分析

说明 author blog.jellyfishmix.com / JellyfishMIX - githubLICENSE GPL-2.0 获取泛型&#xff0c;泛型擦除 下图中示例代码是一个工具类用于生成 csv 文件&#xff0c;需要拿到数据的类型&#xff0c;使用反射感知数据类型的字段&#xff0c;来填充表字段名。可以看到泛型…...

springboot 3.x 之 集成rabbitmq实现动态发送消息给不同的队列

背景 实际项目中遇到针对不同类型的消息&#xff0c;发送消息到不同的队列&#xff0c;而且队列可能还不存在&#xff0c;需要动态创建&#xff0c;于是写了如下代码&#xff0c;实践发现没啥问题&#xff0c;这里分享下。 环境 springboot 3.2 JDK 17 rabbitMQ模型介绍 图片…...

C++ 代码实现鼠标右键注册菜单,一级目录和二级目录方法

最近做的一个项目, 在使用windows的时候,我希望在右键菜单中添加一个自定义的选项, 该选项下有我经常使用的多个程序快捷方式, 直接上代码 头文件 #pragma once #include <Windows.h> #include <iostream> #include <string> using namespace std; …...

SQLite 3 优化批量数据存储操作---事务transaction机制

0、事务操作 事务的目的是为了保证数据的一致性和完整性。 事务&#xff08;Transaction&#xff09;具有以下四个标准属性&#xff0c;通常根据首字母缩写为 ACID&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;确保工作单位内的所有操作都成功完成&…...

[程序员] 表达的能力

之前看CSDN的问答区&#xff0c;很多时候&#xff0c;感觉问题的描述所要表达的意思非常模糊&#xff0c;或者说描述不清。如果是想回答问题的人想回答问题&#xff0c;首先要搞清楚是什么问题&#xff0c;就需要再问问题主很多细节的东西。三来四去&#xff0c;才能搞清楚具体…...

rknn转换后精度差异很大,失真算子自纠

下面是添加了详细注释的优化代码&#xff1a; import cv2 import numpy as np import onnx import onnxruntime as rt from onnx import helper, shape_inferencedef get_all_node_names(model):"""获取模型中所有节点的名称。参数:model (onnx.ModelProto): O…...