python归一化 增大差异_Python逻辑回归模型原理及实际案例应用

前言

上面我们介绍了线性回归, 岭回归, Lasso回归, 今天我们来看看另外一种模型—"逻辑回归". 虽然它有"回归"一词, 但解决的却是分类问题

目录

1. 逻辑回归

2. 优缺点及优化问题

3. 实际案例应用

4. 总结

正文

在前面所介绍的线性回归, 岭回归和Lasso回归这三种回归模型中, 其输出变量均为连续型, 比如常见的线性回归模型为:

其写成矩阵形式为:

现在这里的输出为连续型变量, 但是实际中会有"输出为离散型变量"这样的需求, 比如给定特征预测是否离职(1表示离职, 0表示不离职). 显然这时不能直接使用线性回归模型, 而逻辑回归就派上用场了.

1. 逻辑回归

引用百度百科定义

逻辑(logistic)回归, 又称logistic回归分析,是一种广义的线性回归分析模型,常用于数据挖掘,疾病自动诊断,经济预测等领域。

也就是说逻辑回归是从线性回归模型推广而来的, 我们从假设函数开始说起.

1. 假设函数

现假设因变量取值0和1, 在自变量X的条件下因变量y=1的概率为p, 记作p=P(y=1|X), 那么y=0的概率就为1-p,把因变量取1和取0的概率比值p/(1-p)称为优势比, 对优势比取自然对数, 则可以得到Sigmoid函数:

令Sigmoid(p)=z, 则有:

而Logistic回归模型则是建立在Sigmoid函数和自变量的线性回归模型之上(这可能就是为什么带有"回归"二字的原因吧), 那么Logistic回归模型可以表示为:

上式也常常被称为逻辑回归模型的假设函数, 其函数图像为:

通过图像可以看出

的取值范围为

, h(x)的取值范围为[0, 1], 对于二分类问题来说, h(x)>=0.5则y=1, h(x)<0.5则y=0, 而且通过图像得知: 当

时, h(x)>=0.5, 因此

时y=1, 否则y=0.

模型的假设函数知道了, 接下来看看损失函数.

2. 损失函数

既然逻辑回归是建立在线性回归模型之上, 那么我们先来回顾线性回归的损失函数:

如果将我们逻辑回归的假设函数代入上式损失函数, 绘制出来的图像则是非凸函数, 其很容易产生局部最优解, 而非全局最优解, 为了找到使得全局最优解, 我们需要构造一个凸函数.

由于对数函数能够简化计算过程, 因此这里也是通过对数函数来构建, 先来回归下对数函数的图像(原图来自百度百科):

通过上图可以发现绿线部分与我们要构造的凸函数较接近. 当a=e时, 绿线部分可以分别表示为: -loge(x)和-loge(1-x). 现将x替换为h(x)并同时加入输出变量y (取值为1或0), 则有:

当上式中的y=1时, 其结果为-logeh(x); 当y=0时, 其结果-loge[1-h(x)].

最后, 将上式代入我们的损失函数中, 则有:

当然, 也可以用统计学中的极大似然法构造出上式损失函数. 损失函数有了, 下一步则是求解损失函数最小的算法了.

3. 算法

常用的求解算法有梯度下降法, 坐标轴下降法, 拟牛顿法. 下面只介绍梯度下降法(其他方法还未涉及)

你也许会有疑问, 既然是线性回归模型推广而来, 那么为什么没有最小二乘法呢?最小二乘法是用来求解最小误差平方和的算法, 而误差的平方和正是我们上面提到的线性回归的损失函数, 通过其构造出来的逻辑回归的损失函数是非凸的不容易找到全局最优解, 故不选用最小二乘法, 而通过极大似然法则可以构造出凸函数, 进而可以使用梯度下降法进行求解.

对于梯度下降法的理解在这节, 这里直接给出其表示:

具体的求解过程:

因此, 我们的梯度下降法可以写成(其中, x0=1):

上式也被称为批量梯度下降法, 另外两种: 随机梯度下降法和小批量梯度下降法分别表示为:

2. 优缺点及优化问题

1. 优点

1) 模型简单, 训练速度快, 且对于输出变量有很好的概率解释

2) 可以适用连续型和离散型自变量.

3) 可以根据实际需求设定具体的阀值

2. 缺点

1) 只能处理二分类问题.

2) 适用较大样本量, 这是由于极大似然估计在较小样本量中表现较差.

3) 由于其是基于线性回归模型之上, 因此其同样会出现多重共线性问题.

4) 很难处理数据不均衡问题

3. 优化

1) 可以在二分类上进行推广, 将其推广到多分类回归模型

2) 对于多重共线性问题, 也可以通过删除自变量, 进行数据变换, 正则化, 逐步回归, 主成分分析等方法改善, 对于正则化逻辑回归同样有两种: L1和L2, 其分别表示为:

L1正则化

L2正则化

3. 实际案例应用

1. 数据来源及背景

数据来源: https://www.kaggle.com/jiangzuo/hr-comma-sep/version/1

该数据集包含14999个样本以及10个特征, 通过现有员工是否离职的数据, 建立模型预测有可能离职的员工.

2. 数据概览

1) 查看前2行和后2行数据

importpandas as pd

df= pd.read_csv(r'D:\Data\HR_comma_sep.csv')

pd.set_option('display.max_rows', 4)

df

10个字段分别是: 员工对公司满意度, 最新考核评估, 项目数, 平均每月工作时长, 工作年限, 是否出现工作事故, 是否离职, 过去5年是否升职, 岗位, 薪资水平.

可以看到除过岗位以及薪资水平是字符型外, 其余均是数值型.

2) 查看数据类型等信息

df.info()

RangeIndex: 14999 entries, 0 to 14998

Data columns (total 10 columns):

satisfaction_level 14999 non-null float64

last_evaluation 14999 non-null float64

number_project 14999 non-null int64

average_montly_hours 14999 non-null int64

time_spend_company 14999 non-null int64

Work_accident 14999 non-null int64

left 14999 non-null int64

promotion_last_5years 14999 non-null int64

sales 14999 non-null object

salary 14999 non-null object

dtypes: float64(2), int64(6), object(2)

memory usage: 1.1+ MB

前两个特征为浮点型, 后两个为字符型, 其余为整型, 且均无缺失值.

3). 描述性统计

df.describe()

df.describe(include=['O']).T

满意度: 范围 0.09~1, 中位数0.640, 均值0.613.

最新考核评估: 范围 0.36~1, 中位数0.720, 均值0.716

项目数: 范围 2~7个, 中位数4, 均值3.8

平均每月工作时长 范围96~310小时, 中位数200, 均值201

工作年限: 范围2~10年, 中位数3, 均值3.5.

工作中出现工作事故的占14.46%.

已经离职的占23.81%.

过去5年升职的占2.13%.

员工岗位有10种, 其中最多的是销售, 多达4140.

薪资水平共有3个等级, 最多的是低等, 多达7316.

3. 数据预处理

没有缺失值, 因此不用处理缺失值. 对于记录来说, 其没有唯一标识的字段, 因此会存在重复记录, 这里采取不处理.

1. 异常值

通过箱线图查看异常值.

importseaborn as sns

fig, ax= plt.subplots(1,5, figsize=(12, 2))

sns.boxplot(x=df.columns[0], data=df, ax=ax[0])

sns.boxplot(x=df.columns[1], data=df, ax=ax[1])

sns.boxplot(x=df.columns[2], data=df, ax=ax[2])

sns.boxplot(x=df.columns[3], data=df, ax=ax[3])

sns.boxplot(x=df.columns[4], data=df, ax=ax[4])

除了工作年限外, 其他均无异常值. 该异常值也反映了该公司员工中以年轻人为主

4. 可视化分析

1. 人力资源总体情况

from pyecharts importPie

attr= ["离职", "在职"]

v1=[df.left.value_counts()[1], df.left.value_counts()[0]]

pie= Pie("该公司人力资源总体情况", title_pos='center')

pie.add("",

attr,

v1,

radius=[35, 65],

label_text_color=None,

is_label_show=True,

legend_orient="vertical",

legend_pos="left",

)

pie.render()

离职3571人,占比23.81%; 在职11428人, 占比76.19%

2. 对公司满意度与是否离职的关系

from pyecharts importBoxplot#字段重命名

df.columns=['satisfaction', 'evaluation', 'project', 'hours', 'years_work','work_accident', 'left', 'promotion', 'department', 'salary']#绘制箱线图

boxplot = Boxplot("对公司满意度与是否离职关系图", title_pos='center')

x_axis= ['在职', '离职']

y_axis= [df[df.left == 0].satisfaction.values, df[df.left == 1].satisfaction.values]

boxplot.add("", x_axis, boxplot.prepare_data(y_axis))

boxplot.render()

就中位数而言, 离职人员对公司满意度相对较低, 且离职人员对公司满意度整体波动较大. 另外离职人员中没有满意度为1的评价.

3. 最新考核评估与是否离职的关系

boxplot = Boxplot("最新评估与是否离职关系图", title_pos='center')

x_axis= ['在职', '离职']

y_axis= [df[df.left == 0].evaluation.values, df[df.left == 1].evaluation.values]

boxplot.add("", x_axis, boxplot.prepare_data(y_axis))

boxplot.render()

就中位数而言, 离职人员的最新考核评估相对较高, 但其波动也大.

4. 所参加项目与是否离职的关系

from pyecharts importBar, Pie, Grid#按照项目数分组分别求离职人数和所有人数

project_left_1 = df[df.left == 1].groupby('project')['left'].count()

project_all= df.groupby('project')['left'].count()#分别计算离职人数和在职人数所占比例

project_left1_rate = project_left_1 /project_all

project_left0_rate= 1 -project_left1_rate

attr=project_left1_rate.index

bar= Bar("所参加项目数与是否离职的关系图", title_pos='10%')

bar.add("离职", attr, project_left1_rate, is_stack=True)

bar.add("在职", attr, project_left0_rate, is_stack=True, legend_pos="left", legend_orient="vertical")#绘制圆环图

pie = Pie("各项目数所占百分比", title_pos='center')

pie.add('', project_all.index, project_all, radius=[35, 60], label_text_color=None,

is_label_show=True, legend_orient="vertical", legend_pos="67%")

grid= Grid(width=1200)

grid.add(bar, grid_right="67%")

grid.add(pie)

grid.render()

通过下图可以发现以下2点:

- 离职人员所占比例随着项目数的增多而增大, 2个项目数是特例

- 离职人员比例较高的项目数2, 6, 7在总项目数中所占百分比相对较少. 项目数为2的这部分人可能是工作能力不被认可, 其离职人数也相对较高; 项目数为6, 7的这部分人则工作能力较强, 其可能在其他企业能有更好的发展, 自然离职比例也相对较高.

5. 平均每月工作时长和是否离职的关系

boxplot = Boxplot("平均每月工作时长与是否离职关系图", title_pos='center')

x_axis= ['在职', '离职']

y_axis= [df[df.left == 0].hours.values, df[df.left == 1].hours.values]

boxplot.add("", x_axis, boxplot.prepare_data(y_axis))

boxplot.render()

通过下图可以看到: 离职人员的平均每月工作时长相对较长, 每月按照22个工作日计算, 每日工作时数的中位数为10.18小时, 最大值为14.09小时.

6. 工作年限和是否离职的关系

from pyecharts importBar, Pie, Grid#按照工作年限分别求离职人数和所有人数

years_left_0 = df[df.left == 0].groupby('years_work')['left'].count()

years_all= df.groupby('years_work')['left'].count()#分别计算离职人数和在职人数所占比例

years_left0_rate = years_left_0 /years_all

years_left1_rate= 1 -years_left0_rate

attr=years_all.index

bar= Bar("工作年限与是否离职的关系图", title_pos='10%')

bar.add("离职", attr, years_left1_rate, is_stack=True)

bar.add("在职", attr, years_left0_rate, is_stack=True, legend_pos="left" , legend_orient="vertical")#绘制圆环图

pie = Pie("各工作年限所占百分比", title_pos='center')

pie.add('', years_all.index, years_all, radius=[35, 60], label_text_color=None,

is_label_show=True, legend_orient="vertical", legend_pos="67%")

grid= Grid(width=1200)

grid.add(bar, grid_right="67%")

grid.add(pie)

grid.render()

通过下图可以得出:

- 在各工作年限中, 离职人员较集中于3, 4, 5, 6年, 而6年以上则相对稳定

- 企业中3年人数所占百分比最多, 其次是2年, 主要以年轻人为主

7. 是否发生工作事故与是否离职的关系

from pyecharts importBar

accident_left=pd.crosstab(df.work_accident, df.left)

attr=accident_left.index

bar= Bar("是否发生工作事故与是否离职的关系图", title_pos='center')

bar.add("离职", attr, accident_left[1], is_stack=True)

bar.add("在职", attr, accident_left[0], is_stack=True, legend_pos="left" , legend_orient="vertical", is_label_show=True)

bar.render()

可以看到少部分出现工作事故, 且其中有较少部分人离职.

8. 5年内是否升职与是否离职的关系

promotion_left =pd.crosstab(df.promotion, df.left)

attr=promotion_left.index

bar= Bar("5年内是否升职与是否离职的关系图", title_pos='center')

bar.add("离职", attr, promotion_left[1], is_stack=True)

bar.add("在职", attr, promotion_left[0], is_stack=True, legend_pos="left" , legend_orient="vertical", is_label_show=True)

bar.render()

5年内多数人没有升职, 离职率就相对较高.

9. 岗位与是否离职的关系

#分别计算各岗位离职人员比例和各岗位占总体百分比

department_left_0 = df[df.left == 0].groupby('department')['left'].count()

department_all= df.groupby('department')['left'].count()

department_left0_rate= department_left_0 /department_all

department_left1_rate= 1 -department_left0_rate

attr=department_all.index

bar= Bar("岗位与离职比例的关系图", title_top='40%')

bar.add("离职", attr, department_left1_rate, is_stack=True)

bar.add("在职", attr, department_left0_rate, is_stack=True, is_datazoom_show=True,

xaxis_interval=0, xaxis_rotate=30, legend_top="45%", legend_pos="80%")#绘制圆环图

pie = Pie("各个岗位所占百分比", title_pos='left')

pie.add('', department_all.index, department_all,center=[50, 23], radius=[18, 35], label_text_color=None,

is_label_show=True, legend_orient="vertical", legend_pos="80%", legend_top="4%")

grid= Grid(width=1200, height=700)

grid.add(bar, grid_top="50%", grid_bottom="25%")

grid.add(pie)

grid.render()

通过下图可以看出:

- 销售岗位所占百分比最多, 达到27.6%, 最少是管理层, 其所占百分比是4.2%

- 令人意外的是hr岗位离职比例最大.

10. 薪资水平和是否离职的关系

from pyecharts importBar#按照薪资水平分别求离职人数和所有人数

salary_left = pd.crosstab(df.salary, df.left).sort_values(0, ascending =False)

attr=salary_left.index

bar= Bar("薪资水平和是否离职的关系图", title_pos='center')

bar.add("离职", attr, salary_left[1], is_stack=True)

bar.add("在职", attr, salary_left[0], is_stack=True, legend_pos="left" , legend_orient="vertical", is_label_show=True)

bar.render()

薪资分为三个水平: 低等, 中等, 高等. 低等水平离职人数最多, 所占比例也最大, 而高等则最少.

5. 特征工程

1. 离散型数据处理

离散型数据可分为两种: 一种是定序, 一种是定类.

1) 定序

薪资水平其含有顺序意义, 因此将其字符型转化为数值型

df['salary'] = df.salary.map({"low": 0, "medium": 1, "high": 2})

df.salary.unique()

array([0, 1, 2], dtype=int64)

2) 定类

岗位是定类型变量, 对其进行one-hot编码, 这里直接利用pandas的get_dummies方法.

df_one_hot = pd.get_dummies(df, prefix="dep")

df_one_hot.shape

(14999, 19)

2. 连续型数据处理

逻辑回归模型能够适应连续型变量, 因此可以不用进行离散化处理, 又由于多个特征之间差异差异较大会造成梯度下降算法收敛速度变慢, 故进行归一化处理

#采用max-min归一化方法

hours = df_one_hot['hours']

df_one_hot['hours'] = df_one_hot.hours.apply(lambda x: (x-hours.min()) / (hours.max()-hours.min()))

3. 相关系数

两个变量均是连续型且具有线性关系, 则可以使用皮尔逊相关系数, 否则使用斯皮尔曼相关系数, 这里采用斯皮尔曼相关系数

#计算相关系数

correlation = df_one_hot.corr(method = "spearman")

plt.figure(figsize=(18, 10))#绘制热力图

sns.heatmap(correlation, linewidths=0.2, vmax=1, vmin=-1, linecolor='w',fmt='.2f',

annot=True,annot_kws={'size':10},square=True)

6. 逻辑回归模型

1. 划分数据集

from sklearn.model_selection importtrain_test_split#划分训练集和测试集

X = df_one_hot.drop(['left'], axis=1)

y= df_one_hot['left']

X_train, X_test, y_train, y_test= train_test_split(X, y, test_size=0.2, random_state=1)

2. 训练模型

from sklearn.linear_model importLogisticRegression

LR=LogisticRegression()print(LR.fit(X_train, y_train))print("训练集准确率:", LR.score(X_train, y_train))print("测试集准确率:", LR.score(X_test, y_test))

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,

intercept_scaling=1, max_iter=100, multi_class='warn',

n_jobs=None, penalty='l2', random_state=None, solver='warn',

tol=0.0001, verbose=0, warm_start=False)

训练集准确率: 0.7978998249854155

测试集准确率: 0.7966666666666666

参考官方文档说明, 参数C是正则化项参数的倒数, C的数值越小, 惩罚的力度越大. penalty可选L1, L2正则化项, 默认是L2正则化.

参数solver可选{‘newton-cg’, ‘lbfgs’, ‘liblinear’, ‘sag’, ‘saga’}这5个优化算法:

newton-cg, lbfgs是拟牛顿法, liblinear是坐标轴下降法, sag, saga是随机梯度下降法, saga可以适用于L1和L2正则化项, 而sag只能用于L2正则化项.

#指定随机梯度下降优化算法

LR = LogisticRegression(solver='saga')print(LR.fit(X_train, y_train))print("训练集准确率:", LR.score(X_train, y_train))print("测试集准确率:", LR.score(X_test, y_test))

LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,

intercept_scaling=1, max_iter=100, multi_class='warn',

n_jobs=None, penalty='l2', random_state=None, solver='saga',

tol=0.0001, verbose=0, warm_start=False)

训练集准确率: 0.7980665055421285

测试集准确率: 0.7973333333333333

在选择随机梯度下降法后, 训练集和测试集准确率均略有提升.

3. 调参

#用准确率进行10折交叉验证选择合适的参数C

from sklearn.linear_model importLogisticRegressionCV

Cs= 10**np.linspace(-10, 10, 400)

lr_cv= LogisticRegressionCV(Cs=Cs, cv=10, penalty='l2', solver='saga', max_iter=10000, scoring='accuracy')

lr_cv.fit(X_train, y_train)

lr_cv.C_

array([25.52908068])

用该参数进行预测

LR = LogisticRegression(solver='saga', penalty='l2', C=25.52908068)print("训练集准确率:", LR.score(X_train, y_train))print("测试集准确率:", LR.score(X_test, y_test))

训练集准确率: 0.7984832069339112

测试集准确率: 0.798

训练集和测试集准确率均有所提升, 对于二分类问题, 准确率有时不是很好的评估方法, 这时需要用到混淆矩阵

4. 混淆矩阵

from sklearn importmetrics

X_train_pred=LR.predict(X_train)

X_test_pred=LR.predict(X_test)print('训练集混淆矩阵:')print(metrics.confusion_matrix(y_train, X_train_pred))print('测试集混淆矩阵:')print(metrics.confusion_matrix(y_test, X_test_pred))

训练集混淆矩阵:

[[8494 647]

[1771 1087]]

测试集混淆矩阵:

[[2112 175]

[ 431 282]]

from sklearn.metrics importclassification_reportprint('训练集:')print(classification_report(y_train, X_train_pred))print('测试集:')print(classification_report(y_test, X_test_pred))

训练集:

precision recall f1-score support

0 0.83 0.93 0.88 9141

1 0.63 0.38 0.47 2858

micro avg 0.80 0.80 0.80 11999

macro avg 0.73 0.65 0.67 11999

weighted avg 0.78 0.80 0.78 11999

测试集:

precision recall f1-score support

0 0.83 0.92 0.87 2287

1 0.62 0.40 0.48 713

micro avg 0.80 0.80 0.80 3000

macro avg 0.72 0.66 0.68 3000

weighted avg 0.78 0.80 0.78 3000

在训练集有0.83的精准率和0.93的召回率, 在测试集上有0.83的精准率和0.92的召回率.

7. 朴素贝叶斯模型

朴素贝叶斯模型是基于特征条件独立假设和贝叶斯理论.

from sklearn.naive_bayes importGaussianNBfrom sklearn.model_selection importcross_val_score#构建高斯朴素贝叶斯模型

gnb =GaussianNB()

gnb.fit(X_train, y_train)print("训练集准确率:", gnb.score(X_train, y_train))print("测试集准确率:", gnb.score(X_test, y_test))

X_train_pred=gnb.predict(X_train)

X_test_pred=gnb.predict(X_test)print('训练集混淆矩阵:')print(metrics.confusion_matrix(y_train, X_train_pred))print('测试集混淆矩阵:')print(metrics.confusion_matrix(y_test, X_test_pred))print('训练集:')print(classification_report(y_train, X_train_pred))print('测试集:')print(classification_report(y_test, X_test_pred))

训练集准确率: 0.7440620051670973

测试集准确率: 0.741

训练集混淆矩阵:

[[6791 2350]

[ 721 2137]]

测试集混淆矩阵:

[[1680 607]

[ 170 543]]

训练集:

precision recall f1-score support

0 0.90 0.74 0.82 9141

1 0.48 0.75 0.58 2858

micro avg 0.74 0.74 0.74 11999

macro avg 0.69 0.75 0.70 11999

weighted avg 0.80 0.74 0.76 11999

测试集:

precision recall f1-score support

0 0.91 0.73 0.81 2287

1 0.47 0.76 0.58 713

micro avg 0.74 0.74 0.74 3000

macro avg 0.69 0.75 0.70 3000

weighted avg 0.80 0.74 0.76 3000

可以看到其准确率较逻辑回归低, 但是精准率高于逻辑回归.

8. ROC曲线

from sklearn importmetricsfrom sklearn.metrics importroc_curve#将逻辑回归模型和高斯朴素贝叶斯模型预测出的概率均与实际值通过roc_curve比较返回假正率, 真正率, 阈值

lr_fpr, lr_tpr, lr_thresholds = roc_curve(y_test, LR.predict_proba(X_test)[:,1])

gnb_fpr, gnb_tpr, gnb_thresholds= roc_curve(y_test, gnb.predict_proba(X_test)[:,1])#分别计算这两个模型的auc的值, auc值就是roc曲线下的面积

lr_roc_auc =metrics.auc(lr_fpr, lr_tpr)

gnb_roc_auc=metrics.auc(gnb_fpr, gnb_tpr)

plt.figure(figsize=(8, 5))

plt.plot([0,1], [0, 1],'--', color='r')

plt.plot(lr_fpr, lr_tpr, label='LogisticRegression(area = %0.2f)' %lr_roc_auc)

plt.plot(gnb_fpr, gnb_tpr, label='GaussianNB(area = %0.2f)' %gnb_roc_auc)

plt.xlim([0.0, 1.0])

plt.ylim([0.0, 1.0])

plt.title('ROC')

plt.xlabel('FPR')

plt.ylabel('TPR')

plt.legend()

plt.show()

ROC曲线越靠近左上角说明分类效果越好, 与之对应的auc的值就越大. 对于该数据集来说, 高斯朴素贝叶斯模型略优于逻辑回归模型

总结

本文从逻辑回归模型的原理开始介绍, 并通过实际案例对逻辑回归模型进行应用, 但是结果还不是很好, 一方面是模型表现不是很好(当然, 也仅仅用到了逻辑回归和朴素贝叶斯) ; 另一方面是特征工程没有处理好(朴素贝叶斯模型对特征条件独立假设较敏感), 应当进行特征选择, 比如主成分分析.

参考资料:

网易云课堂《吴恩达机器学习》

《Python数据分析与挖掘实战》

声明: 仅用于学习交流

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433442.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

上周热点回顾(6.17-6.23)

热点随笔&#xff1a; 各地IT薪资待遇讨论&#xff08;潇洒一回&#xff09; 这些年过上幸福生活的程序员&#xff08;上篇&#xff09;&#xff08;飞扬青云&#xff09; 一个线上运营着3000人的游戏&#xff0c;因为我不小心一个DROP DATABASE&#xff0c;全没了。 怎么办…

Boost学习之指针容器--pointer_container

有时,我们可能需要一个包含指针的容器.比如存放一些不可拷贝的对象或者想在容器里存放基类以实现多态.尽管我们可以直接定义存放指针的STL容器,不过这样并不方便,我们得处处小心,在清空或删除容器里的元素时我们要保证异常安全地回收指针所指向的对象,以防内存泄漏. 一个好的办…

libzdb 连接到mysql_MySQL 连接

MySQL 连接使用mysql二进制方式连接您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库。实例以下是从命令行中连接mysql服务器的简单实例&#xff1a;[roothost]# mysql -u root -pEnter password:******在登录成功后会出现 mysql> 命令提示窗口&#xff…

python ios 坐标点击_python点击鼠标获取坐标(Graphics)

使用Python进行图像编程&#xff0c;要使用到Graphics库。下面列举出较常用的代码from graphics import *#设置画布窗口名和尺寸win GraphWin(hehe, 666, 666)#关闭画布窗口win.getMouse()win.close()#画点pt Point(100, 100)pt.draw(win)#画圆cir Circle(Point(200, 200), …

C++ 11右值引用

C 11中引入的一个非常重要的概念就是右值引用。理解右值引用是学习“移动语义”&#xff08;move semantics&#xff09;的基础。而要理解右值引用&#xff0c;就必须先区分左值与右值。对左值和右值的一个最常见的误解是&#xff1a;等号左边的就是左值&#xff0c;等号右边的…

mysql dml ddl优先级_MYSQL入门操作和常规DML、DDL、DQL使用

刷新权限&#xff0c;将某些权限从硬盘刷新到内存中(修改root密码自带隐式刷新权限操作)mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)mysql>查看服务端口mysql> show variables like port;----------------------| Variable_name | Value |--------…

C语言中字符串如何转换为二进制、八进制、十进制、十六进制

在C语言某个程序当中需要把文本16进制转换成对应的16进制数&#xff0c;比如字符串"0x1a"转换成10进制的26&#xff0c;可以用以下函数来实现 相关函数: atof, atoi, atol, strtod, strtoul 表头文件: #include <stdlib.h> 定义函数: long int strtol(const…

python遍历循环中的遍历结构可以是什么_(一)Python入门-4控制语句:06for循环结构-遍历各种可迭代对象-range对象...

一&#xff1a;for循环和可迭代对象遍历for 循环通常用于可迭代对象的遍历。for 循环的语法格式如下&#xff1a;for 变量 in 可迭代对象&#xff1a;循环体语句可迭代对象&#xff1a;Python包含以下几种可迭代对象&#xff1a; 1. 序列。包含&#xff1a;字符串、列表、元组 …

C++11中的右值引用及move语义编程

C0x中加入了右值引用&#xff0c;和move函数。右值引用出现之前我们只能用const引用来关联临时对象&#xff08;右值&#xff09;&#xff08;造孽的VS可以用非const引用关联临时对象&#xff0c;请忽略VS&#xff09;&#xff0c;所以我们不能修临时对象的内容&#xff0c;右值…

IBatis 映射文件 sql 中大于、小于等符号转义

相信好多朋友在写配置文件的时候&#xff0c; 直接写 > 、<、>、< 编译不通过! 这些其实就是 xml 文体的特殊符号,在编写是需要转义&#xff0c;有两种方式处理&#xff0c;如下: 方法一 : 直接替换 <<>><><>&&amp;&apos…

python入侵数据库数据库_一个简单的Python访问Mysql数据库例子

2020/11/3操作记录搭建好Python的数据环境之后&#xff0c;接下来就是在Python代码中访问数据库我先在Navicat图形化界面创建一个数据库命名为pythontest&#xff0c;再在数据库中创建了一个表studentinfo有nid,nname,ngrade,nage四个字段&#xff0c;nid为主键递增。通过查询编…

r语言散点图_R语言 | 散点图入门:以声学元音图为例

R语言语言学与R语言的碰撞Xu & YangPhoneticSan学习参考Discovering Statistics Using RStatistics for Linguistics with RHow to Do Linguistics with RR in ActionAnalyzing Linguistic DataR Graphics Cookbook Recap可以使用plot( )函数进行基础的制图。调用ggplot2包…

oracle中如何创建dblink

当用户要跨本地数据库&#xff0c;访问另外一个数据库表中的数据时&#xff0c;本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访问本地数据库一样访问远程数据库表中的数据。下面讲介绍如何在本地数据库中创建dblink. 创建dblink一般有两种方式&#x…

哪里的mysql性能监控_mysql性能监控工具Innotop简介及配置

# wget http://innotop.googlecode.com/files/innotop-1.9.0.tar.gz# tar -zxvf innotop-1.9.0.tar.gz# cd innotop-1.9.0安装INNOTOP工具非常简单&#xff0c;其是由PERL写的&#xff0c;当然需要PERL环境和相关的工具包。在安装之前先要确定你的系统安装了Time::HiRes,Term::…

python能不能爬数据库_python爬取数据后不能写入到数据库中

目标&#xff1a;去爬当当网某页内容中的书籍的名称&#xff0c;链接和评论数&#xff0c;然后写入数据库中pipelins内容如下&#xff1a;import pymysqlclass DangdangPipeline(object):def process_item(self, item, spider):conn pymysql.connect(host"127.0.0.1"…

mysql创建表里主码和外码_SQL语言创建表时候怎么定义主码和外码

展开全部SQL语言创建表时候用Primary Key(属性名)定义主码&#xff0c;用Foreign Key(属性名)定义外码。主码是一种唯一关键字&#xff0c;表定62616964757a686964616fe59b9ee7ad9431333433623064义的一部分。一个表的主码可以由多个关键字共同组成&#xff0c;并且主码的列不能…

Autodesk 360 Mobile不能显示图片?

在6月21号的DevLab上&#xff0c;有一位朋友说Autodesk 360 Mobile在iPad上不能显示JPG图片预览。我当时没带iPad&#xff0c;不能测试。后天回家在Autodesk 360 Mobile 3.0试了一下&#xff0c;还真是这样。 这应该是Autodesk 360 Mobile 3.0的bug&#xff0c;不过升级到Autod…

关于std:auto_ptr

很多人听说过标准auto_ptr智能指针机制&#xff0c;但并不是每个人都天天使用它。这真是个遗憾&#xff0c;因为auto_ptr优雅地解决了C设计和编码中常见的问题&#xff0c;正确地使用它可以生成健壮的代码。本文阐述了如何正确运用auto_ptr来让你的代码更加安全——以及如何避免…

unity镜头边缘羽化_【后期修图】如何利用Ps中的自适应广角滤波器校正镜头失真?...

当用广角镜头拍摄对象时&#xff0c;透视问题通常以线条的形式出现&#xff0c;这应该是直的&#xff0c;但看起来是弯曲的和扭曲的。这通常被称为桶形失真&#xff0c;其主要发生在广角镜头中&#xff0c;因为图像的放大率越远&#xff0c;主体离镜头的光轴越远。简单来说&…

mysql查看事件任务内容_MySql事件计划任务

DROP EVENT IF EXISTS eve1;DELIMITER $$CREATE EVENT eve1 ON SCHEDULE EVERY 1 SECOND STARTS NOW() ENDS NOW()1ON COMPLETION PRESERVEDISABLEDOBEGINUPDATE testtable1 SET age age1 WHERE id 1;END$$DELIMITER ;SELECT * FROM testtable1;SELECT NOW();/*标准创建语句E…