尹喆, 寧艷群, 何宇雯, 尚笑梅*
(1.蘇州大學(xué) 紡織與服裝工程學(xué)院,江蘇 蘇州 215006;2.湖南東方時裝有限公司,湖南 長沙 410000)
服裝人體測量學(xué)中,第7頸椎點較其他部位更為重要。根據(jù)GB/T 16160—2008《服裝用人體測量的部位與方法》[1],由第7頸椎點展開的測量部位達10多個,例如,頸根圍是用軟尺經(jīng)過第7頸椎點、側(cè)頸點以及頸窩點量取頸根部一周的圍長。在服裝造型設(shè)計中,衣領(lǐng)是上衣的視覺焦點,連接著前后衣片,而其造型的創(chuàng)新設(shè)計離不開頸根圍這一關(guān)鍵數(shù)據(jù)[2-3]。
在采用傳統(tǒng)手工測量的方法尋找第7頸椎點時,通常讓被測者低頭,測量員用手去感知該部位凸出的骨骼點,并進行相關(guān)部位的測量。通過非接觸式人體測量儀獲取人體基準(zhǔn)部位數(shù)據(jù)時,儀器水平投射光線存在掃描盲區(qū),會造成人體點云模型中某些部位的缺失,雖然可以通過點云修補的方法讓模型更完整,但在尋找部位關(guān)鍵點時仍然不能精確定位[4-5]。在測量頸根圍時,常用左右側(cè)頸點、前窩點擬合的曲平面反求第7頸椎點,從圍度進行求解[6]。文中探索第7頸椎點與一些關(guān)鍵部位高度值的關(guān)系,并建立回歸模型,用已知部位高度預(yù)測第7頸椎點高度,為三維人體測量和建模提供參考。
文中實驗所用數(shù)據(jù)來源于蘇州大學(xué)服裝人體測量實驗團隊歷年測體實驗所獲得的手工測量數(shù)據(jù)。
Python是一種面向?qū)ο蟮慕忉屝透呒壘幊陶Z言,其結(jié)構(gòu)簡單,代碼和語法定義清晰明確,易于學(xué)習(xí)和維護,可移植性和可擴展性非常強[7-8];同時,Python在數(shù)據(jù)分析和挖掘領(lǐng)域有許多現(xiàn)成的包和模塊可以直接使用,能夠極大地提高效率;除了語言內(nèi)置庫外,Python還具有大量豐富的第3庫,如numpy,scipy,pandas,matplotlib,sklearn等,包含了數(shù)據(jù)處理分析、統(tǒng)計分析與建模、圖形可視化、數(shù)據(jù)挖掘與機器學(xué)習(xí)等幾乎所有的數(shù)據(jù)分析功能[9]。
數(shù)據(jù)挖掘是在龐大的數(shù)據(jù)庫中通過各種特定算法來搜索和分析其中隱藏但潛在有用信息的過程[10]。
回歸預(yù)測是一種有條件的預(yù)測,依據(jù)估計出的回歸方程,在給定自變量數(shù)值條件下,對因變量進行預(yù)測。依據(jù)相關(guān)關(guān)系中自變量的個數(shù),回歸預(yù)測劃分為一元回歸預(yù)測和多元回歸預(yù)測。
蘇州大學(xué)18~24歲在校大學(xué)生,共計210人,每人測得3組數(shù)據(jù)。
此次第7頸椎高預(yù)測實驗選取了630個人體數(shù)據(jù)樣本。原始數(shù)據(jù)共涉及10個人體測量部位,分別是身高、第7頸椎點高、左肩高、右肩高、側(cè)頸點高、下頜高、腰高、臀高、內(nèi)胯高、下肢高,目的是找出其中與第7頸椎點相關(guān)性高的部位,以預(yù)測第7頸椎點高度值,并建立它們之間的多元回歸方程。
數(shù)據(jù)文件的讀取采用Python第3方數(shù)據(jù)庫pandas中的“.read_csv()”,故將文件格式轉(zhuǎn)為.csv文件,并將其中的數(shù)據(jù)標(biāo)簽屬性全部改為英文(性別:sex,第7頸椎點高:jzg,身高:height,左肩高:zjg,右肩高:yjg,側(cè)頸點高:cjdg,下頜高:xhg,腰高:yg,臀高:tg,內(nèi)胯高:nkg,下肢高:xzg)。將性別屬性更換成0-1型數(shù)據(jù)格式,男性置為“0”,女性置為“1”。
通過pandas中“.describe()”來觀測數(shù)據(jù)的整體范圍、大小以及波動趨勢,發(fā)現(xiàn)不存在缺失值。但通過觀察數(shù)據(jù)的描述性統(tǒng)計表格,發(fā)現(xiàn)某些部位最大值與最大值、最小值與最小值之間出現(xiàn)較大偏差。圖1為每個部位的數(shù)據(jù)分布盒圖,每個部位都有離群點存在。腰高、臀高、內(nèi)胯高、下肢高4個部位離散程度較大,且出現(xiàn)腰高最小值小于臀高最小值、內(nèi)跨高最大值高于臀高最大值的情況,不符合常理,推斷是數(shù)據(jù)錄入時存在錯誤,因此需將異常點剔除。
常用的異常值處理方法有3σ原則法和箱型圖法。3σ原則指在數(shù)據(jù)服從正態(tài)分布的假設(shè)下,99%的數(shù)值應(yīng)該位于均值3個標(biāo)準(zhǔn)差距離之內(nèi),超過此距離,就認為是異常值,該原則適用于數(shù)據(jù)充分大且離散程度較大的情況。箱型圖能夠反映數(shù)據(jù)的真實性,該方法判斷異常值的標(biāo)準(zhǔn)是以四分位數(shù)和四分位距為基礎(chǔ),四分位數(shù)具有一定的魯捧性,在多達25%的數(shù)據(jù)變得任意遠時也不會很大地擾動四分位數(shù),所以異常值不會對這個標(biāo)準(zhǔn)產(chǎn)生影響。箱型圖識別異常值的結(jié)果比較客觀,在識別異常值方面具有一定的優(yōu)越性,因此文中實驗采用箱型圖法識別并剔除異常值,具體結(jié)果如圖2所示。
由圖2可以看出,經(jīng)過數(shù)據(jù)異常值處理后,圖1中每個部位的異常值都已經(jīng)被剔除,數(shù)據(jù)分布正常,沒有異常值點出現(xiàn)。預(yù)處理后的數(shù)據(jù)樣本由原來的630個變?yōu)?98個,其中男性數(shù)據(jù)289個,女性數(shù)據(jù)309個。
文中基于Python的第3方庫statsmodels建立多元線性回歸模型,statsmodels庫提供了許多能夠在Python環(huán)境中自動調(diào)用的函數(shù),如探索性數(shù)據(jù)分析類函數(shù)、統(tǒng)計類函數(shù)以及統(tǒng)計模型估計類和函數(shù),這些函數(shù)可以用作線性回歸分析、廣義線性模型建立、統(tǒng)計檢驗、時間序列分析等。另外,statsmodels庫還具有強大的繪圖能力,常用于展示數(shù)據(jù)分析的直觀效果和診斷已構(gòu)建模型的優(yōu)良性。
普通最小二乘法(ordinary least squares,OLS)是在線性回歸模型中估計未知參數(shù)的線性最小二乘法。OLS通過最小二乘法原則選擇一組解釋變量的線性函數(shù)參數(shù),將給定數(shù)據(jù)集當(dāng)中觀察到的因變量(被預(yù)測變量的值)與預(yù)測變量之間殘差的平方和最小化,在幾何上,可解釋為預(yù)測變量與因變量軸平行的平方距離之和,集合中每個數(shù)據(jù)點與回歸表面上對應(yīng)點之間的差異越小,則模型越適合數(shù)據(jù)[11]。
從statsmodels庫中引入OLS,建立與第7頸椎點相關(guān)變量之間的多元線性回歸模型[12]。具體代碼如下:
#建立回歸模型
from statsmodels.formula.api import ols
formula =' jzg~height+zjg+yjg+cjdg+xhg+yg+tg+nkg+xzg'
est1 = ols(formula,data=df2).fit()
print(est1.summary())
根據(jù)各自變量對應(yīng)回歸系數(shù)的t檢驗P值(P>|t|)大小,可以判定各回歸系數(shù)是否顯著。表1為回歸模型結(jié)果。表1中,如果給定顯著水平α=0.05,則左肩高、右肩高、臀高、內(nèi)胯高、下肢高在顯著水平α=0.05下不顯著。對于不顯著的變量,予以剔除,并建立與剩余變量的線性回歸模型。
建立第7頸椎點高與身高、側(cè)頸點高、下頜高以及腰高的多元回歸模型,核心代碼如下:
#剔除不顯著變量后
formula = ' jzg~height-zjg-yjg+cjdg+xhg+yg-tg-nkg-xzg'
est2 = ols(formula,data=df2).fit()
print(est2.summary())
表1 回歸模型結(jié)果
表2為剩余變量回歸模型結(jié)果。由表2可以看出,剔除不顯著的部位后,余下的身高、側(cè)頸點高、下頜高、腰高的顯著性判定值均小于0.05,都通過F檢驗和回歸系數(shù)顯著性檢驗,但該模型有較強的多重共線性問題。在模型建立之前,已將數(shù)據(jù)進行處理,并沒有發(fā)現(xiàn)數(shù)據(jù)存在問題,原因可能是部位的選取過于接近且在同一個維度上,如身高、下頜高以及側(cè)頸點高的位置過于接近,造成變量選取重復(fù)。但多重共線性不會影響擬合優(yōu)度和預(yù)測優(yōu)度,擬合值也不會受到影響,文中實驗將不針對此問題進行深入討論。
表2 剩余變量回歸模型結(jié)果
上述OLS模型在對原始數(shù)據(jù)訓(xùn)練之前,未將數(shù)據(jù)集進行切分,這會導(dǎo)致預(yù)測模型僅適用于現(xiàn)有的數(shù)據(jù)集。一個模型如果只是重復(fù)它的樣本標(biāo)簽,將獲得一個完美的分數(shù),但在陌生的數(shù)據(jù)集中,它無法預(yù)測任何有用的東西,這種情況稱為過度擬合[13]。為了避免過度擬合,在執(zhí)行機器學(xué)習(xí)實驗時,通常會將部分可用數(shù)據(jù)作為測試集x_test,y_test,然后對測試集進行預(yù)測。
引入機器學(xué)習(xí)庫sklearn中的評分函數(shù)“.score()”,對切分數(shù)據(jù)集前后的線性模型打分。核心代碼如下:
from sklearn import linear_model
from sklearn.model_selection import train_test_
split
x=df2[[' height','cjdg','xhg','yg']]
y=df2[' jzg']
#未切分數(shù)據(jù)集
regr = linear_model.LinearRegression()
regr.fit(x,y)
y_pred = regr.predict(x)
print(' Variance score: %.3f' % r2_score(y,y_pred))
#切分數(shù)據(jù)集
x_train,x_test,y_train,y_test = train_test_split(x,y, test_size=.4,random_state=0)
regr = linear_model.LinearRegression()
fitted=regr.fit(x_train,y_train)
y_pred = regr.predict(x_test)
print(' Variance score: %.3f' % r2_score(y_test,y_pred))
上述代碼運行結(jié)果顯示,未切分數(shù)據(jù)集之前模型評分為0.938,切分數(shù)據(jù)后評分為0.947,比切分前高了約0.01。圖3為預(yù)測結(jié)果和真實結(jié)果比較。由圖3可以看出,預(yù)測結(jié)果較好。實驗選取切分數(shù)據(jù)集后的結(jié)果作為回歸模型的參數(shù),得到多元線性回歸方程式:
yjzg=0.271xheight+0.242xcjdg+0.180xxhg+0.373xyg-3.352
(1)
文中實驗預(yù)測結(jié)果評分較高,且模型存在較強的共線性問題??赡茉蛉缦拢?/p>
1) 數(shù)據(jù)預(yù)處理過程中,對異常值過于嚴(yán)格,導(dǎo)致數(shù)據(jù)離散程度較小、集中度較高,但數(shù)據(jù)樣本量少,預(yù)測處在不同身高檔差范圍內(nèi)的人群時,模型的泛化能力不強,預(yù)測結(jié)果可能較差。
2) 人體各部位之間存在一定的相關(guān)性,用處在同一維度的不同部位來預(yù)測人體第7頸椎點高度,可能出現(xiàn)影響因子冗余現(xiàn)象,而其他維度上的影響因子得不到檢驗,模型魯捧性會降低。同時,通過顯著性檢驗的部位間距較小,可能造成部位選取重復(fù),模型出現(xiàn)擬合過度的情況。對于具有高度相關(guān)性、評分高的模型,模型優(yōu)化效果不太明顯。
服裝用非接觸式人體測量儀的測量精度和速度一直是技術(shù)人員追求和改進的目標(biāo)。由于受人體復(fù)雜生理結(jié)構(gòu)的影響,測量儀難以掃描到部分人體基準(zhǔn)點,無法測得這些點的數(shù)據(jù)。文中以Python語言作為數(shù)據(jù)處理和分析的工具,利用Python中statsmodels庫自帶的OLS完成對人體第7頸椎點高度的預(yù)測,展現(xiàn)出其便利性與靈活性。實驗得出身高、側(cè)頸點高、下頜高、腰高這4個與第7頸椎點相關(guān)性較高的人體縱向尺寸,建立并優(yōu)化了它們之間的多元回歸模型,模型最終得分0.947。該方法為非接觸式人體測量儀在第7頸椎點高度的獲取提供了一種較新穎的解決思路,有助于非接觸式測量儀精度的提高。