Python数据分析案例17——电影人气预测(特征工程构建)

news2024/11/15 20:28:11

案例背景

本次案例是中国人民大学“人工智能与机器学习(2022年秋季)”课程的课堂竞赛。

比赛是根据有关电影的各种信息来预测电影的受欢迎程度,包括演员、工作人员、情节关键字、预算、收入、海报、上映日期、语言、制作公司、国家、TMDB 投票计数、平均投票等。

比赛是在kaggle上进行的,这是链接,可以下载数据

Movie Popularity Prediction | Kaggle

由于原始数据特征变量基本都是文本,本次案例最大价值在于特征工程的构建,即怎么把文本变为数值型变量。


数据读取

导入常用包

#导入数据分析常用包
import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
import seaborn as sns 

%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi']  #中文
plt.rcParams['axes.unicode_minus'] = False   #负号

读取训练集和测试集

data=pd.read_csv('movies_train.csv')
data2=pd.read_csv('movies_test.csv')

查看数据前五行

data.head()

 有点多就不展示完了

 查看训练集和测试集数据基础信息

data=data.infer_objects()
data2=data2.infer_objects()
data.info() ,data2.info()

 可以看到大部分变量都不是数值型,需要进行处理

变量信息解释

id- 电影ID。

title- 电影名称 文本变量

homepage- 电影主页 文本变量

genres- 电影类型 分类型变量

overview- 电影概述 文本变量

poster_path- 电影海报的位置 图片文本

tagline- 电影标语 文本变量

runtime- 电影的运行时间 数值型变量

spoken_languages- 电影口语 分类型变量

original_language- 电影原文 分类型变量

original_title- 电影原名 文本变量

production_companies- 电影制作公司 分类型变量

production_countries- 电影的制作国家 分类型变量

release_date- 电影上映日期 时间变量

budget- 电影预算 数值型变量

revenue- 电影收入 数值型变量

status- 电影状态 分类型变量

vote_count- 电影票数 数值型变量

vote_average- 电影的平均票数 数值型变量

keywords- 电影关键词 文本变量

cast- 电影演员 字典变量

crew- 电影剧组 字典变量

popularity- 电影的人气评分 目标变量,数值型


数据预处理

特征筛选

由于数据的文本型变量较多,较难处理。将一些没用的文本变量和难以提取信息的文本特征选择删除

这里先选择删除电影ID,电影主页,电影概述,电影海报的位置,电影标语,电影关键词,电影制作公司,电影的制作国家

#删除的变量
col_drop=['id','homepage','overview','poster_path','tagline','keywords','production_companies','production_countries']
#测试集ID留着后面提交
ID=data2['id']
data.drop(col_drop,axis=1,inplace=True)
data2.drop(col_drop,axis=1,inplace=True)

新特征构建

剩余的文本变量,一一进行处理,进行新的特征工程的构建。

  1. 首先对电影名称title和电影的原始名original_title称进行一个匹配,相同返回1,不相同返回0,从而构建一个新特征name_change。
  2. 通过对电影源语言spoken_languages是否含有英语(最通用的语言),构建一个虚拟变量spoken,语言里面包含语言返回1,不包含返回0。
  3. 同样我们对电影语言original_language是否为英语,构建虚拟变量original,是英语返回1,不是英语返回0。
  4. 通过对上映日期release_date计算,得到该影片的年龄movie_age。使用2022(今年)-发行年份得到,并转化为整形数。由于计算过程中发行存在缺失值,对缺失值采用均值进行填充。
  5. 对电影演员cast、电影剧组crew的字典变量进行简单处理,计算它们的个数,构建新的特征——电影知名演员个数cast_num,电影剧组成员个数crew_num
  6. 对于电影类别,进行虚拟变量处理。通过代码发现总共有20种电影类别。由于每个电影可能涉及不止一个类别,所以整体构建20个虚拟变量,如果电影类别存在这一类就为1,不存在就为0
  7. 剩下的变量status表示电影的状态,直接进行独立热编码处理就行,生成5个虚拟变量。

首先对电影名称和电影的原始名称进行一个匹配,相同返回1,不相同返回0,从而构建一个新特征

data=data.assign(name_change=lambda d: (d.title==d.original_title)*1)
data2=data2.assign(name_change=lambda d: (d.title==d.original_title)*1)
def check_languages(txt):
    txt=eval(txt)
    if 'en'in txt:
        languages=1
    else:
        languages=0
    return languages
data['spoken']=data['spoken_languages'].apply(check_languages)
data2['spoken']=data2['spoken_languages'].apply(check_languages)

 电影原文也是一样的处理

def check_languages2(txt):
    if  txt=='en':
        languages=1
    else:
        languages=0
    return languages
data['original']=data['original_language'].apply(check_languages2)
data2['original']=data2['original_language'].apply(check_languages2)

通过对发行日期计算,得到该影片的年龄, 缺失值采用均值填充

data['movie_age']=(2022-pd.to_datetime(data['release_date']).dt.year).fillna((2022-pd.to_datetime(data['release_date']).dt.year).mean()).astype('int')
data2['movie_age']=(2022-pd.to_datetime(data2['release_date']).dt.year).fillna((2022-pd.to_datetime(data2['release_date']).dt.year).mean()).astype('int')

对电影演员、电影剧组的字典变量进行简单处理,计算它们的个数,构建一个新的特征

def check(d):
    return len(d)
data['cast_num']=data['cast'].apply(check)
data2['cast_num']=data2['cast'].apply(check)

data['crew_num']=data['crew'].apply(check)
data2['crew_num']=data2['crew'].apply(check)

对于电影类别,进行虚拟变量处理,由于一个电影可能属于多个类别,不能直接独立热编码,需要进行处理。

首先得到所有类别的名称列表

all_kind=[]
for a in [eval(i)for i in data['genres'].unique()]:
    for a1 in a:
        all_kind.append(a1)
set_kind=list(set(all_kind))

 定义处理函数,生成虚拟变量

def check2(txt):
    txt=eval(txt)
    dummys=[]
    for k in set_kind:
        if k in txt:
            dummys.append(1)
        else:
            dummys.append(0)
    return np.array(dummys)
def check3(col,data):
    all_kind=[]
    for a in [eval(i)for i in data[col].unique()]:
        for a1 in a:
            all_kind.append(a1)
    set_kind=list(set(all_kind))
    print(f'{col}特征里面有{len(set_kind)}个类别,生成{len(set_kind)}个虚拟变量')
    dummys_max=np.array([np.array(arr) for arr in data[col].apply(check2).to_numpy()])
    for i,kind in enumerate(set_kind):
        data[f'{col}_{kind}']=dummys_max[:,i]

 应用函数

check3('genres',data)
check3('genres',data2)

 这样每个电影对应20个类别特征,如果它属于这个类别,取值为1,不属于取值为0。

将构建完的旧特征进行删除

#删除的变量
col_drop2=['original_title','title','release_date','cast','crew','genres','spoken_languages','original_language']
data.drop(col_drop2,axis=1,inplace=True)
data2.drop(col_drop2,axis=1,inplace=True)

剩下的变量status是典型的分类变量,可以直接进行虚拟变量独热处理

data=pd.get_dummies(data)
data2=pd.get_dummies(data2)

再次查看所有变量的信息

data.info()
data2.info()

 可以看到所有的特征变量都是数值型,可以进行模型运算了。

但是电影时间一列还有缺失值,需要填充,采用均值进行填充。

data['runtime']=data['runtime'].fillna(data['runtime'].mean())
data2['runtime']=data2['runtime'].fillna(data2['runtime'].mean())

status这个变量测试集独热出来多了一列,由于训练集的status没有status_Canceled这个情况,我们选择进行删除这个虚拟变量特征

data2.drop(columns=['status_Canceled'],inplace=True)

 最后我们将训练集的y——popularity作为响应变量提取出来,完成特征工程的构建。

取出y

y=data['popularity']
data.drop(columns=['popularity'],inplace=True)

取出X

X=data.copy()
X2=data2[data.columns]

查看训练集,测试集,y的形状

print(X.shape,y.shape,X2.shape)

可以看到最终训练集和测试集都是36个变量,训练集31801条,测试集13629条,下面开始数据探索分析机器学习的模型构建。


数据探索

特征变量分布探索

#查看特征变量的箱线图分布
columns = data.columns.tolist() # 列表头
dis_cols = 6                   #一行几个
dis_rows = len(columns)
plt.figure(figsize=(4 * dis_cols, 4 * dis_rows))
 
for i in range(len(columns)):
    plt.subplot(dis_rows,dis_cols,i+1)
    sns.boxplot(data=data[columns[i]], orient="v",width=0.5)
    plt.xlabel(columns[i],fontsize = 20)
plt.tight_layout()
#plt.savefig('特征变量箱线图.jpg',dpi=512)
plt.show()

 

 可以看到分类型的虚拟变量较多,数值型变量——budget,revenue,runtime的极大值较多

#画密度图,训练集和测试集对比 

dis_cols = 6                   #一行几个
dis_rows = len(columns)
plt.figure(figsize=(4 * dis_cols, 4 * dis_rows))
 
for i in range(len(columns)):
    ax = plt.subplot(dis_rows, dis_cols, i+1)
    ax = sns.kdeplot(data[columns[i]], color="Red" ,shade=True)
    ax = sns.kdeplot(data2[columns[i]], color="Blue",warn_singular=False,shade=True)
    ax.set_xlabel(columns[i],fontsize = 20)
    ax.set_ylabel("Frequency",fontsize = 18)
    ax = ax.legend(["train", "test"])
plt.tight_layout()
#plt.savefig('训练测试特征变量核密度图.jpg',dpi=500)
plt.show()

 训练集和测试集数据的分布还是较为一致


异常值处理

y异常值处理

y是数值型变量,画其箱线图直方图密度图

# 查看y的分布
#回归问题
plt.figure(figsize=(6,2),dpi=128)
plt.subplot(1,3,1)
y.plot.box(title='响应变量箱线图')
plt.subplot(1,3,2)
y.plot.hist(title='响应变量直方图')
plt.subplot(1,3,3)
y.plot.kde(title='响应变量核密度图')
#sns.kdeplot(y, color='Red', shade=True)
#plt.savefig('处理前响应变量.png')
plt.tight_layout()
plt.show()

 可以看到y有很严重的异常值,要筛掉,将y大于50的样本都筛掉

#处理y的异常值
y=y[y <= 50]
plt.figure(figsize=(6,2),dpi=128)
plt.subplot(1,3,1)
y.plot.box(title='响应变量箱线图')
plt.subplot(1,3,2)
y.plot.hist(title='响应变量直方图')
plt.subplot(1,3,3)
y.plot.kde(title='响应变量核密度图')
#sns.kdeplot(y, color='Red', shade=True)
#plt.savefig('处理后响应变量.png')
plt.tight_layout()
plt.show()

 

可以看到极端值情况好了一些,然后将筛出来的样本赋值给x

#筛选给x
X=X.iloc[y.index,:]
X.shape

 

31801数据变成了31771条。

X异常值处理

#X异常值处理,先标准化

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_s = scaler.fit_transform(X)
X2_s = scaler.fit_transform(X2)

 #然后画图查看

plt.figure(figsize=(20,8))
plt.boxplot(x=X_s,labels=data.columns)
plt.hlines([-20,20],0,len(columns))
plt.xticks(rotation=40)
#plt.savefig('特征变量标准化箱线图.png',dpi=256)
plt.show()

可以看到budget,revenue,runtime,vote_count,genres_Family,status_In Production,status_Planned这几个特征都有严重的异常值,超过了20倍的方差,需要进行筛除。

 #异常值多的列进行处理 

def deal_outline(data,col,n):   #数据,要处理的列名,几倍的方差
    for c in col:
        mean=data[c].mean()
        std=data[c].std()
        data=data[(data[c]>mean-n*std)&(data[c]<mean+n*std)]
        #print(data.shape)
    return data

超过10倍方差进行删除

X=deal_outline(X,['budget','revenue','runtime','vote_count','genres_Family','status_In Production','status_Planned'],10)
y=y[X.index]
X.shape,y.shape

还剩31536个样本

 

相关系数矩阵

corr = plt.subplots(figsize = (18,16),dpi=128)
corr= sns.heatmap(data.assign(Y=y).corr(method='spearman'),annot=True,square=True)
#plt.savefig('训练集特征热力图.png',dpi=512)

 特征有点多,可能不是很清楚

可以看到y与budget,revenue,cast_num,crew_num,vote_count这几个变量的相关性高,说明这几个变量对于y的影响较大。


机器学习

划分训练集和验证集,80%训练,20%进行验证

from sklearn.model_selection import train_test_split
X_train,X_val,y_train,y_val=train_test_split(X,y,test_size=0.2,random_state=0)

数据标准化

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train_s = scaler.transform(X_train)
X_val_s = scaler.transform(X_val)
X2_s=scaler.transform(X2)
print('训练数据形状:')
print(X_train_s.shape,y_train.shape)
print('验证测试数据形状:')
(X_val_s.shape,y_val.shape,X2_s.shape)

 

模型选择

采用十种模型,对比验证集精度

from sklearn.linear_model import LinearRegression
from sklearn.linear_model import ElasticNet
from sklearn.neighbors import KNeighborsRegressor
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import GradientBoostingRegressor
from xgboost.sklearn import XGBRegressor
from lightgbm import LGBMRegressor
from sklearn.svm import SVR
from sklearn.neural_network import MLPRegressor

定义评估函数

from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error,r2_score
 
def evaluation(y_test, y_predict):
    mae = mean_absolute_error(y_test, y_predict)
    mse = mean_squared_error(y_test, y_predict)
    rmse = np.sqrt(mean_squared_error(y_test, y_predict))
    #mape=(abs(y_predict -y_test)/ y_test).mean()
    r_2=r2_score(y_test, y_predict)
    return mae, rmse, r_2  #mse

模型实例化

#线性回归
model1 = LinearRegression()
 
#弹性网回归
model2 = ElasticNet(alpha=0.05, l1_ratio=0.5)
 
#K近邻
model3 = KNeighborsRegressor(n_neighbors=10)
 
#决策树
model4 = DecisionTreeRegressor(random_state=77)
 
#随机森林
model5= RandomForestRegressor(n_estimators=500,  max_features=int(X_train.shape[1]/3) , random_state=0)
 
#梯度提升
model6 = GradientBoostingRegressor(n_estimators=500,random_state=123)
 
#极端梯度提升
model7 =  XGBRegressor(objective='reg:squarederror', n_estimators=1000, random_state=0)
 
#轻量梯度提升
model8 = LGBMRegressor(n_estimators=1000,objective='regression', # 默认是二分类
                      random_state=0)
 
#支持向量机
model9 = SVR(kernel="rbf")
 
#神经网络
model10 = MLPRegressor(hidden_layer_sizes=(16,8), random_state=77, max_iter=10000)
 
model_list=[model1,model2,model3,model4,model5,model6,model7,model8,model9,model10]
model_name=['线性回归','惩罚回归','K近邻','决策树','随机森林','梯度提升','极端梯度提升','轻量梯度提升','支持向量机','神经网络']

拟合训练模型,计算模型误差指标 

df_eval=pd.DataFrame(columns=['MAE','RMSE','R2'])
for i in range(10):
    model_C=model_list[i]
    name=model_name[i]
    model_C.fit(X_train_s, y_train)
    pred=model_C.predict(X_val_s)
    s=evaluation(y_val,pred)
    df_eval.loc[name,:]=list(s)

查看不同模型的评价指标

df_eval

 画图查看

bar_width = 0.4
colors=['c', 'b', 'g', 'tomato', 'm', 'y', 'lime', 'k','orange','pink','grey','tan']
fig, ax = plt.subplots(3,1,figsize=(6,12))
for i,col in enumerate(df_eval.columns):
    n=int(str('31')+str(i+1))
    plt.subplot(n)
    df_col=df_eval[col]
    m =np.arange(len(df_col))
    
    #hatch=['-','/','+','x'],
    plt.bar(x=m,height=df_col.to_numpy(),width=bar_width,color=colors)
    
    #plt.xlabel('Methods',fontsize=12)
    names=df_col.index
    plt.xticks(range(len(df_col)),names,fontsize=14)
    plt.xticks(rotation=40)
    
    if col=='R2':
        plt.ylabel(r'$R^{2}$',fontsize=14)
    else:
        plt.ylabel(col,fontsize=14)
plt.tight_layout()
#plt.savefig('柱状图.jpg',dpi=512)
plt.show()

 我们采用三种最优的模型进一步搜索最优超参数:随机森林,梯度提升,轻量梯度,然后进行预测和存储。


超参数搜索 

轻量梯度超参数优化

#利用K折交叉验证搜索最优超参数
from sklearn.model_selection import KFold, StratifiedKFold
from sklearn.model_selection import GridSearchCV,RandomizedSearchCV
# Choose best hyperparameters by RandomizedSearchCV
#随机搜索决策树的参数
param_distributions = {'max_depth': range(4, 10), 'subsample':np.linspace(0.5,1,5 ),'num_leaves': [15, 31, 63, 127],
                       'colsample_bytree': [0.6, 0.7, 0.8, 1.0]}
                        # 'min_child_weight':np.linspace(0,0.1,2 ),
kfold = KFold(n_splits=3, shuffle=True, random_state=1)
model =RandomizedSearchCV(estimator= LGBMRegressor(objective='regression',random_state=0),
                          param_distributions=param_distributions, n_iter=200)
model.fit(X_train_s, y_train)

#查看最优参数
model.best_params_ 

最优参数赋值给模型,然后拟合评价

model = model.best_estimator_
model.score(X_val_s, y_val)

 

可以看到拟合优度上升了一点

#利用找出来的最优超参数在所有的训练集上训练,然后预测

model=LGBMRegressor(objective='regression',subsample=0.625,learning_rate= 0.01,n_estimators= 1000,num_leaves=15,
                    max_depth= 4,colsample_bytree=1.0,random_state=0)
model.fit(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val])
print(model.score(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val]))
pred=model.predict(X2_s)

储存预测结果

df=pd.DataFrame(ID)
df['popularity']=pred
df.to_csv('LGBM预测结果.csv',index=False)

#梯度提升和随机森林也是一样搜索超参数,然后训练和预测

#梯度提升
param_distributions = {'max_depth': range(4, 10), 'subsample':np.linspace(0.5,1,5 ),'learning_rate': np.linspace(0.05,0.3,6 ), 'n_estimators':[100,500,1000,1500, 2000]}
                        # 'min_child_weight':np.linspace(0,0.1,2 ),
kfold = KFold(n_splits=3, shuffle=True, random_state=1)
model =RandomizedSearchCV(estimator= GradientBoostingRegressor(n_estimators=500,random_state=123),param_distributions=param_distributions, n_iter=5)
model.fit(X_train_s, y_train)
model = model.best_estimator_
model.fit(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val])
print(model.score(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val]))
pred=model.predict(X2_s)
df['popularity']=pred
df.to_csv('梯度提升预测结果.csv',index=False)

#随机森林
param_distributions = {'max_depth': range(4, 10), 'n_estimators':[100,500,1000,1500, 2000]}
kfold = KFold(n_splits=3, shuffle=True, random_state=1)
model =RandomizedSearchCV(estimator=RandomForestRegressor(n_estimators=500,  max_features=int(X_train.shape[1]/3) , random_state=0),param_distributions=param_distributions, n_iter=5)
model.fit(X_train_s, y_train)
model = model.best_estimator_
model.fit(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val])
print(model.score(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val]))
pred=model.predict(X2_s)
df['popularity']=pred
df.to_csv('随机森林提升预测结果.csv',index=False)

 

下面就可以将这三个预测结果题kaggle提交了!!!


变量重要性

以LGBM为例,画出每个特征变量对响应变量影响程度的图。

model=LGBMRegressor(objective='regression',subsample=0.5,learning_rate= 0.01,n_estimators= 1000,num_leaves=127,
                    max_depth= 4,colsample_bytree=1.0,random_state=0)
model.fit(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val])
plt.figure(figsize=(4,8))
sorted_index = model.feature_importances_.argsort()
plt.barh(range(data.shape[1]), model.feature_importances_[sorted_index])
plt.yticks(np.arange(data.shape[1]), data.columns[sorted_index])
plt.xlabel('Feature Importance')
plt.ylabel('Feature')
plt.show()

 

可以看到影响y变量最重要的是vote_count,movie_age,cast_num,crew_num等变量, 

movie_age,cast_num,crew_num变量是自己构建的变量,说明这几个特征还是很有效的。


目前在kaggle上能得到最好的预测结果的最好的模型参数。

model=LGBMRegressor(objective='regression',subsample=0.65,learning_rate= 0.01,n_estimators= 800,num_leaves=127,
                    max_depth= 5,colsample_bytree=0.75,random_state=10)
model.fit(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val])
print(model.score(np.r_[X_train_s,X_val_s],np.r_[y_train,y_val]))
pred=model.predict(X2_s)
df['popularity']=pred
df.to_csv('LGBM2.csv',index=False)

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

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

相关文章

【概率论】期末复习笔记:参数估计

参数估计目录一、点估计1. 估计量的概念2. 估计量的求法矩估计法最大似然估计法二、估计量的评选标准1. 无偏性2. 有效性3. 相合性总结三、区间估计1. 双侧区间估计2. 单侧区间估计四、正态总体参数的区间估计σ2\sigma^2σ2已知&#xff0c;考察μ\muμ</font>σ2\sigma…

车载以太网 - DoIP报文类型 - 02

上次我们聊了什么是DoIP&#xff0c;以及DoIP在车载网络以及车载ECU中的作用&#xff0c;我们应该有大概的了解&#xff0c;以及它的极大地作用&#xff0c;今天我们开始全面的去了解它&#xff0c;毕竟只有等我们了解它以后&#xff0c;才能更好的应用。今天要聊的第一个内容呢…

沃太能源冲刺上市:亿纬锂能、高瓴均为股东,收入主要来自境外

12月30日&#xff0c;沃太能源股份有限公司&#xff08;下称“沃太能源”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺科创板上市&#xff0c;沃太能源计划募资10亿元&#xff0c;中信证券为其保荐机构。 按照计划&#xff0c;沃太能源将其中…

网络编程 udp/ip协议 c/s模型

目录 1.概念​编辑 2.代码解析 1.recvfrom函数 2.sendto函数 3.内核泄露问题 整体代码 1.概念 2.代码解析 1.recvfrom函数 该函数接收数据报&#xff0c;并存储源地址&#xff0c;即得到当前服务器接收到的消息&#xff0c;并且存储在参数2&#xff0c;该函数是阻塞的&#x…

c++构造和析构

1.构造函数 1.构造函数特性 构造函数名字和类名相同构造函数没有返回值(void有返回值&#xff0c;返回值为空)不写构造函数&#xff0c;每一个类中都存在默认的构造函数&#xff0c;默认的构造函数是没有参数的default显示使用默认的构造函数delete删掉默认函数当我们自己写了…

MM采购订单及发票相关后台表介绍(图解)

EKPO 采购凭证项目 EKKO 采购凭证抬头 EORD 采购货源清单 EINA 采购信息记录 - 一般数据 EINE 采购信息记录 - 采购组织数据 EKET 计划协议计划行 EKES 供应商确认 EKKN 采购凭证中的帐户设置 EKBE 采购凭证历史 EKBZ 每个采购凭证的历史&#xff1a;交货费用 RBKP 凭…

在wsl下开发T113的主线linux(2)-编译awboot

意外发现有awboot能够代替uboot直接引导内核&#xff0c;体验了一下果断选择awboot&#xff0c;因为足够简洁&#xff0c;编译大小只有32k&#xff0c;和uboot接近1M的体量相比&#xff0c;简直是小而美&#xff0c;启动速度也比uboot快上不少&#xff0c;也能同时支持sd卡&…

DoIP协议从入门到精通系列——车载网络拓扑

因特网协议(IP-Internet protocol)是互联网规范中的基本协议,它仅是支持互联网正常运转“TCP/IP”协议簇之一。UDP协议也是TCP/IP协议体系中的内容(因为名称中只含有TCP/IP名称,往往会忽略UDP)。以太网引入到车载网络后,汽车也会慢慢进入车联网时代(或者物联网,万物互…

aws codepipeline 在pipeline构建过程中使用变量

参考资料 Action structure reference codebuild构建环境中的环境变量 codepipeline中的变量 在codePipeline中使用变量 对于codepipeline来说&#xff0c;管道结构中的每个操作都有自身的结构和定义&#xff0c;本文主要讨论不同资源的输出变量。 基本概念 变量允许用户…

数据完整性(一)

目录 数据完整性&#xff1a; 什么是数据完整性&#xff1a; 数据完整性的类型 1&#xff1a;实体完整性 2&#xff1a;域完整性&#xff1a; 3、引用完整性&#xff1a; 4、自定义完整性&#xff1a; 完整性约束&#xff1a; 数据完整性的实现方式&#xff1a; 实体完整性&a…

抽象⼯⼚模式

抽象⼯⼚模式 1.抽象工厂模式介绍 抽象⼯⼚模式与⼯⼚⽅法模式虽然主要意图都是为了解决&#xff0c;接⼝选择问题。但在实现上&#xff0c;抽象⼯⼚是⼀ 个中⼼⼯⼚&#xff0c;创建其他⼯⼚的模式。 2.案例场景模拟 2.1场景简述 很多时候初期业务的蛮荒发展&#xff0c;也…

NLP中隐性语义分析及奇异值分解(SVD)-学习笔记

目录 1、隐性语义分析 2、奇异值分解 2.1 左奇异向量U 2.2 奇异值向量S 2.3 右奇异值向量V^T 2.4 SVD矩阵的方向 2.5 主题约简 1、隐性语义分析 隐形语义分析基于最古老和最常用的降维技术–奇异值分解(SVD)。SVD将一个矩阵分解成3个方阵&#xff0c;其中一个是对角矩阵…

网络类型实验报告

实验拓扑 实验要求 1.R2为ISP&#xff0c;其上只能配置IP地址 2.R1-R2之间为HDLC封装 3.R2-R3之间为ppp封装&#xff0c;pap认证&#xff0c;R2为主认证方 4.R2-R4之间为PPP封装&#xff0c;chap认证&#xff0c;R2为主认证方 5.R1、R2、R3构建MGRE环境&#xff0c;仅R1P地址固…

【C++】-- C++11基础常用知识点

目录 C11简介 统一的列表初始化 &#xff5b;&#xff5d;初始化 std::initializer_list std::initializer_list使用场景&#xff1a; 声明 auto decltype nullptr 范围for循环 STL中一些变化 新容器 array容器 forward_list容器 容器中的一些新方法 C11简介 在…

TDK | RoboKit1-DK 开发平台为实现未来机器人的多样性扫清障碍

机器人行业正在飞速发展&#xff0c;新技术亦层出不穷。TDK 现推出了 TDK RoboKit1-DK 机器人开发平台&#xff0c;该平台配备了机器人精确操作所必需的各种传感器&#xff0c;有助于在各种机器人开发中提高效率和性能。 在技术快速进步与成长的环境中&#xff0c;机器人开发所…

计算机组成原理实验——二、寄存器实验

一、实验目的 1.掌握寄存器堆的工作原理和接口。 2.掌握寄存器堆的实现方法。 3.掌握寄存器堆在微处理器中承担的功能。 二&#xff0e;实验内容 设计一32*32bit 的寄存器文件&#xff0c;即32 个 32 位的寄存器文件&#xff08;寄存器组&#xff09; –具备两组读端口及一组…

【王道操作系统】2.2.1 处理机调度的概念与层次

处理机调度的概念与层次 文章目录处理机调度的概念与层次1.调度的基本概念2.调度的三个层次2.1 高级调度(作业调度)2.2 中级调度(内存调度)2.3 进程的挂起状态与七状态模型2.4 低级调度(进程调度)2.5 三层调度的联系和对比1.调度的基本概念 2.调度的三个层次 2.1 高级调度(作业…

GroundTrue和里程计输出的位姿的参考坐标系不一致的情况

这里写目录标题前言数据集描述使用TF工具包获取使用Eigen库计算置换输出误差对比没做转换之前转换之后前言 最近遇到一个数据集的ground true参考坐标和vSLAM输出的位姿的参考坐标不一样的问题&#xff0c;记录一下。 在之前参加的一个PRCV 2022的多传感器融合SLAM挑战赛中也同…

MATLAB读取tif格式图像

tif格式数据本质上就是带有地理信息的矩阵数据。 geotiffread函数 MATLAB帮助-geotiffread 语法Syntax&#xff1a; [A,R] geotiffread(filename) [X,cmap,R] geotiffread(filename) [A,refmat,bbox] geotiffread(filename) [X,cmap,refmat,bbox] geotiffread(filenam…

Symbol详解

Symbol Symbol是es6引入的一个新的原始数据类型&#xff0c;是一个独一无二的值。 目前为止&#xff0c;js的数据类型有以下几种&#xff1a; 数据类型说明undefinedundefinednullnullboolean布尔值string字符串number数字Bigint大整数Object对象SymbolSymbol Symbol通过Symb…