【数据挖掘与商务智能决策】第十三章 数据降维之PCA 主成分分析

news2024/7/4 5:57:25

13.1.2 PCA主成分分析代码实现

1.二维空间降维Python代码实现

import numpy as np
X = np.array([[1, 1], [2, 2], [3, 3]])
X
array([[1, 1],
       [2, 2],
       [3, 3]])
# 也可以通过pandas库来构造数据,效果一样
import pandas as pd
X = pd.DataFrame([[1, 1], [2, 2], [3, 3]])
X
01
011
122
233
# 数据降维,由二维降至一维
from sklearn.decomposition import PCA
pca = PCA(n_components=1)
pca.fit(X)  # 进行降维模型训练
X_transformed = pca.transform(X)  # 进行数据降维,并赋值给X_transformed

X_transformed  # 查看降维后的结果
array([[-1.41421356],
       [ 0.        ],
       [ 1.41421356]])
# 查看此时的维度
X_transformed.shape
(3, 1)
# 查看降维的系数
pca.components_  
array([[0.70710678, 0.70710678]])
# 查看线性组合表达式
a = pca.components_[0][0] 
b = pca.components_[0][1]
print(str(a) + ' * X + ' +  str(b) + ' * Y')
0.7071067811865476 * X + 0.7071067811865475 * Y

这个的确也和12.1.1节我们获得的线性组合是一样的。

2.三维空间降维Python代码实现

import pandas as pd
X = pd.DataFrame([[45, 0.8, 9120], [40, 0.12, 2600], [38, 0.09, 3042], [30, 0.04, 3300], [39, 0.21, 3500]], columns=['年龄(岁)', '负债比率', '月收入(元)'])
X
年龄(岁)负债比率月收入(元)
0450.809120
1400.122600
2380.093042
3300.043300
4390.213500
# 因为三个指标数据的量级相差较大,所以可以先进行数据归一化处理
from sklearn.preprocessing import StandardScaler
X_new = StandardScaler().fit_transform(X)

X_new  # 查看归一化后的数据
array([[ 1.36321743,  1.96044639,  1.98450514],
       [ 0.33047695, -0.47222431, -0.70685302],
       [-0.08261924, -0.57954802, -0.52440206],
       [-1.73500401, -0.75842087, -0.41790353],
       [ 0.12392886, -0.15025319, -0.33534653]])
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(X_new)  # 进行降维模型训练
X_transformed = pca.transform(X_new)  # 进行数据降维,并赋值给X_transformed

X_transformed  # 查看降维后的结果
array([[ 3.08724247,  0.32991205],
       [-0.52888635, -0.74272137],
       [-0.70651782, -0.33057258],
       [-1.62877292,  1.05218639],
       [-0.22306538, -0.30880449]])
# 查看降维的系数
pca.components_  
array([[ 0.52952108,  0.61328179,  0.58608264],
       [-0.82760701,  0.22182579,  0.51561609]])
dim = ['年龄(岁)', '负债比率', '月收入(元)']
for i in pca.components_:
    formula = []
    for j in range(len(i)):
        formula.append(str(i[j]) + ' * ' + dim[j])
    print(" + ".join(formula))
0.5295210839165538 * 年龄(岁) + 0.6132817922410683 * 负债比率 + 0.5860826434841948 * 月收入(元)
-0.8276070105929828 * 年龄(岁) + 0.2218257919336094 * 负债比率 + 0.5156160917294705 * 月收入(元)
# 如果不想显示具体的特征名称,可以采用如下的写法
dim = ['X', 'Y', 'Z']
for i in pca.components_:
    formula = []
    for j in range(len(i)):
        formula.append(str(i[j]) + ' * ' + dim[j])
    print(" + ".join(formula))
0.5295210839165538 * X + 0.6132817922410683 * Y + 0.5860826434841948 * Z
-0.8276070105929828 * X + 0.2218257919336094 * Y + 0.5156160917294705 * Z

13.2 案例实战: 人脸识别模型

13.2.1 案例背景

13.2.2 人脸数据读取、处理与变量提取

1. 读取人脸照片数据

import os
names = os.listdir('olivettifaces')

names[0:5]  # 查看前5项读取的文件名
['10_0.jpg', '10_1.jpg', '10_2.jpg', '10_3.jpg', '10_4.jpg']
# 获取到文件名称后,便可以通过如下代码在Python中查看这些图片
from PIL import Image
img0 = Image.open('olivettifaces\\' + names[0])
img0.show()
img0  # 在Jupyter Notebook中可以直接输入变量名查看图像


在这里插入图片描述

2.人脸数据处理: 特征变量提取

# 图像灰度处理及数值化处理
import numpy as np
img0 = img0.convert('L')
img0 = img0.resize((32, 32))
arr = np.array(img0)

arr  # 查看数值化后的结果
array([[186,  76,  73, ..., 100, 103, 106],
       [196,  85,  68, ...,  85, 106, 103],
       [193,  69,  79, ...,  82,  99, 100],
       ...,
       [196,  87, 193, ..., 103,  66,  52],
       [219, 179, 202, ..., 150, 127, 109],
       [244, 228, 230, ..., 198, 202, 206]], dtype=uint8)
# 如果觉得numpy格式的arr不好观察,则可以通过pandas库将其转为DataFrame格式进行观察
import pandas as pd
pd.DataFrame(arr)
0123456789...22232425262728293031
018676738789887581100102...71757573768595100103106
119685687810497100948387...5259708562828985106103
219369799210510211211710694...414550765974838299100
31866771758599114115109109...424340524161697676108
417946415053698091108104...433730313543596156101
5173334349485364697275...38363332394568604583
6173303741425781887764...31323532354965645387
7171243236425577101107102...54646351536056464989
8170213129283547627683...10510189634542413761101
9172212227283033434644...129118103743927363468101
10171233021303644514641...1361261201027040303578101
11175213331425471736459...14213312211411177313695104
12192422737638799111116116...105108108107109104585910097
13196824158102112110110107108...70718610210711684779599
14192887895968781725140...627373101116116998088105
1519088102114997655555037...1001121201201251251059710198
1618910611111313712411310910396...1341371421461341209611512293
17188106132119142160158153148145...16315815614212411010011410886
1819383140130122141153160168177...16315814812911210399997877
1919081117127107120134146163166...15714513211710510390646772
201938384106104113122134138143...14212911610910510286556063
2119478879192108113122127140...14012811811310910168565656
2219180898890104114120131141...13012911910810310150535553
231897789918693111122133129...1021131111071018553515455
241908688878787104115127115...105108104102975553505359
251877489819313010396110108...111105103102835049565149
2619079811071662061198894105...1021049910011111157485253
2719278831732111581141008794...101989896116123119524955
28188701361771981081011198681...9898938280123145734351
291968719318717911312312311081...95909677531601241036652
3021917920219619814612211811994...9290875789126140150127109
31244228230231233213188195193189...179184177161202182207198202206

32 rows × 32 columns

# 上面获得的32*32的二维数组,还不利于数据建模,所以我们还需要通过reshape(1, -1)方法将其转换成一行(若reshape(-1,1)则转为一列),也即1*1024格式
arr = arr.reshape(1, -1)

print(arr)  # 查看转换后的结果,这一行数就是代表那张人脸图片了,其共有32*32=1024列数
[[186  76  73 ... 198 202 206]]

因为总共有400张照片需要处理,若将400个二维数组堆叠起来会形成三维数组,因为我们需要使用flatten()函数将1*1024的二维数组降维成一维数组,并通过tolist()函数将其转为列表方便之后和其他图片的颜色数值信息一起处理。

print(arr.flatten().tolist())  # 下面这一行数就是那张人脸转换后的结果了
[186, 76, 73, 87, 89, 88, 75, 81, 100, 102, 105, 92, 74, 65, 65, 53, 43, 55, 53, 42, 58, 77, 71, 75, 75, 73, 76, 85, 95, 100, 103, 106, 196, 85, 68, 78, 104, 97, 100, 94, 83, 87, 88, 89, 86, 70, 65, 61, 55, 52, 38, 32, 52, 66, 52, 59, 70, 85, 62, 82, 89, 85, 106, 103, 193, 69, 79, 92, 105, 102, 112, 117, 106, 94, 91, 112, 101, 87, 75, 61, 58, 54, 49, 48, 44, 41, 41, 45, 50, 76, 59, 74, 83, 82, 99, 100, 186, 67, 71, 75, 85, 99, 114, 115, 109, 109, 98, 101, 86, 68, 74, 65, 58, 53, 51, 52, 42, 40, 42, 43, 40, 52, 41, 61, 69, 76, 76, 108, 179, 46, 41, 50, 53, 69, 80, 91, 108, 104, 98, 93, 91, 88, 73, 60, 56, 55, 51, 49, 53, 55, 43, 37, 30, 31, 35, 43, 59, 61, 56, 101, 173, 33, 43, 49, 48, 53, 64, 69, 72, 75, 82, 84, 84, 82, 72, 75, 69, 71, 67, 56, 58, 55, 38, 36, 33, 32, 39, 45, 68, 60, 45, 83, 173, 30, 37, 41, 42, 57, 81, 88, 77, 64, 63, 64, 65, 64, 48, 48, 68, 62, 47, 50, 45, 31, 31, 32, 35, 32, 35, 49, 65, 64, 53, 87, 171, 24, 32, 36, 42, 55, 77, 101, 107, 102, 98, 83, 71, 64, 44, 48, 54, 64, 76, 65, 49, 48, 54, 64, 63, 51, 53, 60, 56, 46, 49, 89, 170, 21, 31, 29, 28, 35, 47, 62, 76, 83, 87, 78, 53, 58, 65, 83, 90, 97, 108, 101, 97, 105, 105, 101, 89, 63, 45, 42, 41, 37, 61, 101, 172, 21, 22, 27, 28, 30, 33, 43, 46, 44, 43, 46, 50, 63, 76, 87, 95, 104, 114, 120, 122, 125, 129, 118, 103, 74, 39, 27, 36, 34, 68, 101, 171, 23, 30, 21, 30, 36, 44, 51, 46, 41, 45, 52, 61, 70, 84, 101, 112, 119, 126, 131, 134, 138, 136, 126, 120, 102, 70, 40, 30, 35, 78, 101, 175, 21, 33, 31, 42, 54, 71, 73, 64, 59, 65, 78, 95, 106, 110, 116, 122, 130, 140, 143, 141, 142, 142, 133, 122, 114, 111, 77, 31, 36, 95, 104, 192, 42, 27, 37, 63, 87, 99, 111, 116, 116, 117, 117, 121, 122, 120, 119, 120, 121, 120, 113, 107, 106, 105, 108, 108, 107, 109, 104, 58, 59, 100, 97, 196, 82, 41, 58, 102, 112, 110, 110, 107, 108, 107, 107, 115, 126, 126, 118, 98, 87, 69, 57, 55, 55, 70, 71, 86, 102, 107, 116, 84, 77, 95, 99, 192, 88, 78, 95, 96, 87, 81, 72, 51, 40, 52, 53, 68, 89, 116, 111, 83, 61, 44, 55, 61, 42, 62, 73, 73, 101, 116, 116, 99, 80, 88, 105, 190, 88, 102, 114, 99, 76, 55, 55, 50, 37, 60, 53, 49, 84, 161, 155, 109, 94, 83, 76, 84, 88, 100, 112, 120, 120, 125, 125, 105, 97, 101, 98, 189, 106, 111, 113, 137, 124, 113, 109, 103, 96, 84, 84, 99, 123, 172, 176, 139, 130, 127, 120, 116, 115, 134, 137, 142, 146, 134, 120, 96, 115, 122, 93, 188, 106, 132, 119, 142, 160, 158, 153, 148, 145, 156, 151, 139, 139, 160, 177, 151, 138, 141, 153, 162, 164, 163, 158, 156, 142, 124, 110, 100, 114, 108, 86, 193, 83, 140, 130, 122, 141, 153, 160, 168, 177, 171, 154, 135, 137, 161, 176, 158, 146, 143, 142, 159, 164, 163, 158, 148, 129, 112, 103, 99, 99, 78, 77, 190, 81, 117, 127, 107, 120, 134, 146, 163, 166, 155, 134, 138, 137, 153, 164, 141, 132, 132, 127, 148, 156, 157, 145, 132, 117, 105, 103, 90, 64, 67, 72, 193, 83, 84, 106, 104, 113, 122, 134, 138, 143, 141, 138, 93, 69, 84, 86, 71, 62, 75, 106, 142, 146, 142, 129, 116, 109, 105, 102, 86, 55, 60, 63, 194, 78, 87, 91, 92, 108, 113, 122, 127, 140, 148, 154, 121, 80, 72, 66, 80, 96, 106, 112, 137, 147, 140, 128, 118, 113, 109, 101, 68, 56, 56, 56, 191, 80, 89, 88, 90, 104, 114, 120, 131, 141, 145, 150, 153, 142, 144, 124, 105, 111, 119, 121, 128, 128, 130, 129, 119, 108, 103, 101, 50, 53, 55, 53, 189, 77, 89, 91, 86, 93, 111, 122, 133, 129, 125, 126, 118, 117, 115, 111, 100, 85, 87, 86, 76, 88, 102, 113, 111, 107, 101, 85, 53, 51, 54, 55, 190, 86, 88, 87, 87, 87, 104, 115, 127, 115, 101, 88, 83, 84, 91, 96, 108, 114, 101, 98, 106, 103, 105, 108, 104, 102, 97, 55, 53, 50, 53, 59, 187, 74, 89, 81, 93, 130, 103, 96, 110, 108, 108, 129, 126, 112, 119, 108, 96, 98, 105, 110, 117, 118, 111, 105, 103, 102, 83, 50, 49, 56, 51, 49, 190, 79, 81, 107, 166, 206, 119, 88, 94, 105, 112, 116, 113, 106, 96, 92, 95, 102, 103, 107, 113, 108, 102, 104, 99, 100, 111, 111, 57, 48, 52, 53, 192, 78, 83, 173, 211, 158, 114, 100, 87, 94, 108, 114, 115, 119, 129, 146, 151, 144, 140, 133, 121, 112, 101, 98, 98, 96, 116, 123, 119, 52, 49, 55, 188, 70, 136, 177, 198, 108, 101, 119, 86, 81, 94, 105, 115, 123, 127, 128, 126, 122, 119, 109, 97, 97, 98, 98, 93, 82, 80, 123, 145, 73, 43, 51, 196, 87, 193, 187, 179, 113, 123, 123, 110, 81, 73, 81, 88, 96, 97, 95, 91, 91, 89, 86, 91, 99, 95, 90, 96, 77, 53, 160, 124, 103, 66, 52, 219, 179, 202, 196, 198, 146, 122, 118, 119, 94, 76, 73, 72, 74, 77, 73, 74, 79, 77, 83, 92, 94, 92, 90, 87, 57, 89, 126, 140, 150, 127, 109, 244, 228, 230, 231, 233, 213, 188, 195, 193, 189, 181, 173, 171, 171, 171, 168, 168, 171, 173, 178, 182, 179, 179, 184, 177, 161, 202, 182, 207, 198, 202, 206]
# 构造所有图片的特征变量
X = []  # 特征变量
for i in names:
    img = Image.open('olivettifaces\\' + i)
    img = img.convert('L')
    img = img.resize((32, 32))
    arr = np.array(img)
    X.append(arr.reshape(1, -1).flatten().tolist())
import pandas as pd
X = pd.DataFrame(X)

X  # 查看400张图片转换后的结果
0123456789...1014101510161017101810191020102110221023
018676738789887581100102...179184177161202182207198202206
11969097989887101896573...181167190188203209205198190190
2193899799757483647786...178178156185195201206201189190
3192849389978966606057...173151199189203200196186182184
4194724945563744627171...192194192176174224200218176168
..................................................................
395114115115119115120117118113112...190193169141142144143141143215
396115118117117116118117119117116...187189183216189193148144142212
397113116113117114121121120121114...184188185221203192144143137212
398110109109110110112112113113111...172171209212175136142141137213
399105107111112113113113116116107...181184220188140139142141138213

400 rows × 1024 columns

print(X.shape)  # 查看此时的表格结构
(400, 1024)

3. 人脸数据处理: 目标变量提取

# 获取目标变量y:第一张图片演示
print(int(names[0].split('_')[0]))
10
# 批量获取所有图片的目标变量y
y = []  # 目标变量
for i in names:
    img = Image.open('olivettifaces\\' + i)
    y.append(int(i.split('_')[0]))
    
print(y)  # 查看目标变量,也就是对应的人员编号
[10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]

13.2.3 数据划分与降维

1. 划分训练集和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)

2. PCA数据降维

# 数据降维模型训练
from sklearn.decomposition import PCA
pca = PCA(n_components=100)
pca.fit(X_train)
PCA(n_components=100)
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
PCA(n_components=100)
# 对训练集和测试集进行数据降维
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
# 我们通过如下代码验证PCA是否降维:
print(X_train_pca.shape)
print(X_test_pca.shape)
(320, 100)
(80, 100)
# 如果想查看此时降维后的X_train_pca和X_test_pca,可以直接将它们打印出来查看,也可以将它们转为DataFrame格式进行查看,代码如下:
# pd.DataFrame(X_train_pca).head()
# pd.DataFrame(X_test_pca).head()
# 在PCA后面加个“?”运行可以可以看看官方的一些提示
# PCA?

13.2.4 模型的搭建与使用

1. 模型搭建

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()  # 建立KNN模型  
knn.fit(X_train_pca, y_train)  # 用降维后的训练集进行训练模型
KNeighborsClassifier()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KNeighborsClassifier()

2. 模型预测

y_pred = knn.predict(X_test_pca)  # 用降维后的测试集进行测试
print(y_pred)  # 将对测试集的预测结果打印出来
[ 9 21  3 40 26  4 28 37 12 36 26  7 27 21  3 24  7  2 17 24 21 32  8  2
 11 19  6 29  6 29 18 10 25 35 10 18 15  5  9 22 34 29  2 16  8 18  8 38
 39 35 16 30 30 11 37 36 35 20 33  6  1 16 31 32  5 30  1 39 35 39  2 19
  5  8 11  4 14 27 22 24]
# 通过和之前章节类似的代码,我们可以将预测值和实际值进行对比:
import pandas as pd
a = pd.DataFrame()  # 创建一个空DataFrame 
a['预测值'] = list(y_pred)
a['实际值'] = list(y_test)

a.head()  # 查看表格前5行
预测值实际值
099
12121
233
34040
42626
# 查看预测准确度 - 方法1
from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)
0.9125
# 查看预测准确度 - 方法2
score = knn.score(X_test_pca, y_test)
print(score)
0.9125

3. 模型对比(数据降维与不降维)

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()  # 建立KNN模型  
knn.fit(X_train, y_train)  # 不使用数据降维,直接训练
y_pred = knn.predict(X_test)  # 不使用数据降维,直接测试

from sklearn.metrics import accuracy_score
score = accuracy_score(y_pred, y_test)
print(score)
0.9125

此时获得的准确度评分score为0.91,可以看到使用数据降维对提高模型预测效果还是有一些效果的,这里的数据量并不大,当数据量更大的时候,利用PCA主成分分析进行数据降维则会发挥更大的作用。

13.3 补充知识点:人脸识别外部接口调用

13.3.1 baidu-aip库安装

pip install baidu-aip

13.3.2 调用接口进行人脸识别和打分

from aip import AipFace
import base64

# 下面3行内容为自己的APP_ID,API_KEY,SECRET_KEY
APP_ID = '16994639'    #  '25572406'
API_KEY = 'L9XnkKQEMnHhB5omF2P8D9OM'   #'FFg2mnhYI8dD46uenYXjzhlg'
SECRET_KEY = 'nnOZDoruZ6AjVglBs6ecvUjFRIAKrn9T' #'ra9rPr3E4wuonUAEB7X1x41aKnh7qFy7'

# 把上面输入的账号信息传入接口
aipFace = AipFace(APP_ID, API_KEY, SECRET_KEY)

# 下面一行内容为需要识别的人脸图片的地址,其他地方就不用改了
filePath = r'张起凡.jpg'

# 定义打开文件的函数
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        content = base64.b64encode(fp.read())
        return content.decode('utf-8')

imageType = "BASE64"

# 选择最后要展示的内容,这里展示age(年龄);gender(性别);beauty(颜值)
options = {}
options["face_field"] = "age,gender,beauty"

# 调用接口aipFace的detect()函数进行人脸识别,打印结果
result = aipFace.detect(get_file_content(filePath), imageType, options)
print(result)

# 打印具体信息,本质就是列表索引和字典的键值对应
age = result['result']['face_list'][0]['age']
print('年龄预测为:' + str(age))
gender = result['result']['face_list'][0]['gender']['type']
print('性别预测为:' + gender)
beauty = result['result']['face_list'][0]['beauty']
print('颜值评分为:' + str(beauty))
{'error_code': 0, 'error_msg': 'SUCCESS', 'log_id': 943952634, 'timestamp': 1682385343, 'cached': 0, 'result': {'face_num': 1, 'face_list': [{'face_token': '8898d344d778dd12bcbc4efe488da9aa', 'location': {'left': 313.02, 'top': 379.26, 'width': 328, 'height': 309, 'rotation': 14}, 'face_probability': 1, 'angle': {'yaw': -23.27, 'pitch': 7.04, 'roll': 13.28}, 'age': 22, 'gender': {'type': 'male', 'probability': 0.99}, 'beauty': 53.09}]}}
年龄预测为:22
性别预测为:male
颜值评分为:53.09

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

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

相关文章

二分查找【数组】

⭐前言⭐ ※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入复习模式。若有错误,请多多指教。更多有趣的代码请移步Gitee 👍 点赞 ⭐ 收藏 📝留言 都是我创作的最大的动力! 题目 70…

接口测试用例设计思路

(我的公众号“墨石测试攻略”,关注获取软件测试相关知识及整套接口测试实战项目!) 接口测试用例的设计,从功能测试角度来说:首先需要分析接口文档。 现在很多公司都使用swagger来管理接口。swagger中可以…

fMRI时间序列振幅和相位对功能连接分析的影响

导读 目的:fMRI领域的一些研究使用瞬时相位(IP)表征(源自BOLD时间序列的解析表征)考察了脑区之间的同步性。本研究假设来自不同脑区的瞬时振幅(IA)表征可以为脑功能网络提供额外的信息。为此,本研究探索了静息态BOLD fMRI信号的这种表征,用于…

SpringBoot AnnotationFormatterFactory接口+自定义注解实现类型转换

参考资料 自定义AnnotationFormatterFactory实现注解方式类型转换Spring MVC 基于AnnotationFormatterFactory接口实现自定义的规则 目录 一. 前期准备1.1. 自定义转换标记注解1.2 入参form 二. 实现AnnotationFormatterFactory接口,构建格式化Factory2.1 code补全…

【7】一篇文章学习 Linux 中一些硬核的常用知识

目录 一、systemctl二、软链接三、日期(date 命令)四、Linux 的时区(1) 修改时区(2) ntp 五、IP 地址六、主机名七、域名解析八、配置 Linux 的固定 IP 地址(1) 在 VMwareWorkstation 中配置 IP 地址网关和网段(IP 地址的范围)(2)…

[陇剑杯 2021]之Misc篇(NSSCTF)刷题记录④

NSSCTF-Misc篇-[陇剑杯 2021] jwt:[陇剑杯 2021]jwt(问1)[陇剑杯 2021]jwt(问2)[陇剑杯 2021]jwt(问3)[陇剑杯 2021]jwt(问4)[陇剑杯 2021]jwt(问5&#xff0…

洗地性价比高的是哪款?性价比高的洗地机推荐

在如今人工智能随处可见的时代,洗地机已经成为了我们家庭清洁的得力助手,它用高效便捷的清洁方式,对于地面的灰尘或者地板之间的缝隙里的细小垃圾,能够快速清理,省时省力。然而,对于很多消费者来说&#xf…

一文带你学会如何写一份糟糕透顶的简历

我们每个人几乎都会面对找工作这件事,而找工作或者说求职首先就是要写一份简历。今天狗哥将以一个不同的视角带你写一份无与伦比,糟糕透顶的求职简历,说实话,其实几年前,我就是这么写的。 目录 1. 文件名 2. 基本信…

AttributeError: ‘ChatGLMModel‘ object has no attribute ‘prefix_encoder‘

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于蛋白-配体复合物药效团药物设计(Pharmacophore)

基于蛋白-配体复合物药效团药物设计(Pharmacophore) step 1.蛋白-配体复合物准备 点击File-->Import Structures导入之前已经下载好的1IEP.pdb(Abl蛋白和Imatinib的晶体复合物) 蛋白准备:点击Tasks--->Protei…

18、越狱

一、越狱 1.1 越狱 通过iOS系统安全启动链漏洞,从而禁止掉信任链中负责验证的组件.拿到iOS系统最大权限Root权限 1.2 iOS系统安全启动链 当启动一台iOS设备时,系统首先会从只读的ROM中读取初始化指令,也就是系统的引导程序(事实上所有的操作系统启动时都要经过这一步,只是过程…

Pytorch深度学习笔记(十一)卷积神经网络CNN

目录 1.概述 2.单通道卷积 3.多通道卷积 4.卷积层常见的参数 5.代码实现(卷积神经网络训练MNIST数据集) 推荐课程:10.卷积神经网络(基础篇)_哔哩哔哩_bilibili 1.概述 全连接神经网络:完全由线性层串…

最佳实践|如何写出简单高效的 Flink SQL?

摘要:本文整理自阿里巴巴高级技术专家、Apache Flink PMC 贺小令,在 Flink Forward Asia 2022 生产实践专场的分享。本篇内容主要分为三个部分: 1. Flink SQL Insight 2. Best Practices 3. Future Works Tips:点击「阅读原文」查…

android之 Launcher改造仿桌面排版的效果

一,背景 1.1 新接手一个灯光控制项目,其页面和效果还是比交复杂的,其中一个功能就是仿苹果桌面来排版灯具,支持拖拽,分组,分页。 拖动图标的时候判断是否空白位置还是已经有占位了,有的话就把…

pikachu靶场-RCE

RCE漏洞概述 可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。 远程系统命令执行 命令执行漏洞(Command Execution)即黑客可以直接在Web应用中执行系统命令,从而获取敏感信息或者拿下shell权限 更…

Linux离线状态下安装cuda、cudnn、cudatoolkit

目录 1. 下载与安装说明2. CUDA安装3. cuDNN安装4. cudatoolkit安装5. 测试安装成功 1. 下载与安装说明 工具包下载地址 CUDA历史版本下载地址:https://developer.nvidia.com/cuda-toolkit-archivecuDNN历史版本下载地址:https://developer.nvidia.com/r…

logback日志框架集成方式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、logback是什么?二、使用步骤1.使用方式控制台输出配置文件输出配置html输出配置定期删除配置方式 总结 前言 提示:这里可以添加本文…

C++每日一练:最长递增区间 阿波罗的魔力宝石 投篮

文章目录 前言一、最长递增区间二、阿波罗的魔力宝石三、投篮总结 前言 今天的题太简单,甚至 “最长递增区间” 和 “投篮” 就是一个问题。实在没事干,也给做了!直接上代码算了… 提示:以下是本篇文章正文内容 一、最长递增区间…

LSSANet:一种用于肺结节检测的长、短切片感知网络

文章目录 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection摘要方法Long Short Slice GroupingLong Short Slice-Aware Network 实验结果 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection 摘要 提出了一个长短片感知网…

【JAVA程序设计】(C00130)基于SpringBoot的社区养老医疗综合服务系统

基于SpringBoot的社区养老医疗综合服务系统 项目简介项目获取开发环境项目技术运行截图 项目简介 基于基于SpringBoot的社区养老医疗综合服务系统共分为三个角色:系统管理员、医生、用户 管理员角色包含以下功能: 用户管理、角色管理、部门管理、字典管…