數(shù)據(jù)挖掘?qū)д摗С窒蛄繖C(jī)

明天就要講課了巫湘,總覺得炫乓,還是拿代碼說事兒,最靠譜,最有說服力

https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html
經(jīng)常用到sklearn中的SVC函數(shù)抡蛙,這里把文檔中的參數(shù)翻譯了一些卿拴,以備不時之需蹈矮。

本身這個函數(shù)也是基于libsvm實現(xiàn)的揪漩,所以在參數(shù)設(shè)置上有很多相似的地方。(PS: libsvm中的二次規(guī)劃問題的解決算法是SMO)乘陪。

sklearn.svm.SVC(C=1.0,?kernel='rbf',?degree=3,?gamma='auto',?coef0=0.0,?shrinking=True,?probability=False,

tol=0.001,?cache_size=200,?class_weight=None,?verbose=False,?max_iter=-1,?decision_function_shape=None,random_state=None)

參數(shù):

l? C:C-SVC的懲罰參數(shù)C?默認(rèn)值是1.0

C越大统台,相當(dāng)于懲罰松弛變量,希望松弛變量接近0啡邑,即對誤分類的懲罰增大饺谬,趨向于對訓(xùn)練集全分對的情況,這樣對訓(xùn)練集測試時準(zhǔn)確率很高谣拣,但泛化能力弱募寨。C值小,對誤分類的懲罰減小森缠,允許容錯拔鹰,將他們當(dāng)成噪聲點,泛化能力較強(qiáng)贵涵。

l??kernel?:核函數(shù)列肢,默認(rèn)是rbf,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’?

?   0 – 線性:u'v

?   1 – 多項式:(gamma*u'*v + coef0)^degree

?   2 – RBF函數(shù):exp(-gamma|u-v|^2)

?   3 –sigmoid:tanh(gamma*u'*v + coef0)

l??degree?:多項式poly函數(shù)的維度宾茂,默認(rèn)是3瓷马,選擇其他核函數(shù)時會被忽略。

l??gamma?:?‘rbf’,‘poly’ 和‘sigmoid’的核函數(shù)參數(shù)跨晴。默認(rèn)是’auto’欧聘,則會選擇1/n_features

l??coef0?:核函數(shù)的常數(shù)項。對于‘poly’和 ‘sigmoid’有用端盆。

l??probability?:是否采用概率估計怀骤?.默認(rèn)為False

l??shrinking?:是否采用shrinking heuristic方法,默認(rèn)為true

l??tol?:停止訓(xùn)練的誤差值大小焕妙,默認(rèn)為1e-3

l??cache_size?:核函數(shù)cache緩存大小蒋伦,默認(rèn)為200

l??class_weight?:類別的權(quán)重,字典形式傳遞焚鹊。設(shè)置第幾類的參數(shù)C為weight*C(C-SVC中的C)

l??verbose?:允許冗余輸出痕届?

l??max_iter?:最大迭代次數(shù)。-1為無限制。

l??decision_function_shape?:‘ovo’, ‘ovr’ or None, default=None3

l??random_state?:數(shù)據(jù)洗牌時的種子值研叫,int值

主要調(diào)節(jié)的參數(shù)有:C势决、kernel、degree蓝撇、gamma、coef0陈莽。


numpy.random.rand()

numpy.random.rand()

numpy.random.rand(d0,d1,…,dn)

rand函數(shù)根據(jù)給定維度生成[0,1)之間的數(shù)據(jù)渤昌,包含0,不包含1

dn表格每個維度

返回值為指定維度的array

eg:

np.random.randn(2,4)

>>>array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345],

? ? ? ? ? [-1.16724625, -0.22408299,? 0.63006614, -0.41714538]])


In your?clf,

coef_?are the weights assigned to the features; (Note it only works for linear SVM)

support_vectors_?and?support_?are the support vectors and the corresponding index;

dual_coef_?is the coefficients of the support vector in the decision function; and

intercept_?is the bias in decision function.


coef_?:?array, shape = [n_class * (n_class-1) / 2, n_features]

Weights assigned to the features (coefficients in the primal problem). This is only available in the case of a linear kernel.

coef_?is a readonly property derived from?dual_coef_?and?support_vectors_.

intercept_?:?array, shape = [n_class * (n_class-1) / 2]

Constants in decision function.



[0]是索引走搁,就是取第一個

support_?:?array-like, shape = [n_SV]

Indices of support vectors.

support_vectors_?:?array-like, shape = [n_SV, n_features]

Support vectors.

n_support_?:?array-like, dtype=int32, shape = [n_class]

Number of support vectors for each class.

我的無法畫圖独柑,加上

%matplotlib inline

就可以了

好了,別人的代碼已經(jīng)運(yùn)行好了私植,現(xiàn)在來讀代碼:


(1)數(shù)據(jù)集:

1)數(shù)據(jù)集介紹:

? ? ? LFW數(shù)據(jù)集主要測試人臉識別的準(zhǔn)確率忌栅,該數(shù)據(jù)庫從中隨機(jī)選擇了6000對人臉組成了人臉辨識圖片對,其中3000對屬于同一個人2張人臉照片曲稼,3000對屬于不同的人每人1張人臉照片索绪。測試過程LFW給出一對照片,詢問測試中的系統(tǒng)兩張照片是不是同一個人贫悄,系統(tǒng)給出“是”或“否”的答案瑞驱。通過6000對人臉測試結(jié)果的系統(tǒng)答案與真實答案的比值可以得到人臉識別準(zhǔn)確率。這個集合被廣泛應(yīng)用于評價 face verification算法的性能窄坦。

2)數(shù)據(jù)集獲取方法:

#原始圖像為250 x 250像素唤反,但默認(rèn)切片并調(diào)整大小參數(shù)將它們減少到62 x 74。

def fetch_lfw_people(data_home=None, funneled=True, resize=0.5,

? ? ? ? ? ? ? ? ? ? min_faces_per_person=0, color=False,

? ? ? ? ? ? ? ? ? ? slice_=(slice(70, 195), slice(78, 172)),

? ? ? ? ? ? ? ? ? ? download_if_missing=True)

各參數(shù)意義:

data_home:可選鸭津,默認(rèn)值:無

? ? ? ? ? ? ? ? ? ? ? 為數(shù)據(jù)集指定另一個下載和緩存文件夾彤侍。默認(rèn)情況下

? ? ? ? ? ? ? ? ? ? ? 所有scikit學(xué)習(xí)數(shù)據(jù)都存儲在'?/ scikit_learn_data'子文件夾中

funneled:? ??boolean,optional逆趋,默認(rèn)值:True

? ? ? ? ? ? ? ? ? ? ? 下載并使用數(shù)據(jù)集的漏斗變體盏阶。

resize:? ? ? ? ?float,optional闻书,默認(rèn)值0.5

? ? ? ? ? ? ? ? ? ? ? ?比率用于調(diào)整每張臉部圖片的大小般哼。

min_faces_per_person:int,optional惠窄,默認(rèn)無

? ? ? ? ? ? ? ? ? ? ? 提取的數(shù)據(jù)集將僅保留具有at的人的圖片

? ? ? ? ? ? ? ? ? ? ? 至少`min_faces_per_person`不同的圖片蒸眠。

color:? ? ? ? ??布爾值,可選杆融,默認(rèn)為False

? ? ? ? ? ? ? ? ? ? ? ?保留3個RGB通道楞卡,而不是將它們平均為一個灰度通道。如果顏色為True,則數(shù)據(jù)的形狀? ? ? ? ? ? ? ? ? ? ? ? ?具有比顏色= False的形狀多一個維度蒋腮。

slice_:? ? ? ? ?可選

? ? ? ? ? ? ? ? ? ? ? ?提供自定義2D切片(高度淘捡,寬度)以提取 '有趣'的jpeg文件部分,避免使用統(tǒng)計來自背景? ? ? ? ? ? ? ? ? ? ? ? ?的相關(guān)性

download_if_missing:可選池摧,默認(rèn)為True

? ? ? ? ? ? ? ? ? ? ? 如果為False焦除,則在數(shù)據(jù)不在本地可用時引發(fā)IOError 而不是嘗試從源站點下載數(shù)據(jù)。

返回值的意義:

dataset:具有以下屬性的類似dict的對象:

? ? ? ? ? ? ? ? dataset.data:numpy數(shù)組形狀(13233,2914)

? ? ? ? ? ? ? 每行對應(yīng)于原始尺寸62 x 47的拉面圖像像素作彤。更改``slice_``或調(diào)整大小參數(shù)將改變輸出形狀 dataset.images:numpy數(shù)組形狀(13233,62,47)

? ? ? ? ? ? ? ? ?每行是一個面部圖像膘魄,對應(yīng)于5749人中的一個數(shù)據(jù)集。更改``slice_``或調(diào)整大小參數(shù)將會改? ? ? ? ? ? ? ? ? ? ?變輸出的形狀竭讳。

dataset.target:numpy數(shù)組形狀(13233创葡,)

? ? ? ? ? ? ? ? ? 與每個面部圖像相關(guān)聯(lián)的標(biāo)簽。這些標(biāo)簽的范圍為0-5748并對應(yīng)于人員ID绢慢。

dataset.DESCR:string

? ? ? ? ? ? ? ? ? ? 野外Labeled Faces(LFW)數(shù)據(jù)集的描述灿渴。

3)fetch_lfw_people主要的實現(xiàn)思路

1、獲取人臉數(shù)據(jù)集的文件路徑胰舆,其中check_fetch_lfw函數(shù)完成此功能骚露。check_fetch_lfw函數(shù)會根據(jù)給定的路徑判斷路徑下是否有人臉數(shù)據(jù)集,若有缚窿,返回數(shù)據(jù)集路徑荸百,若沒有,那么他會從網(wǎng)上下載滨攻,然后自動解壓够话,將解壓后的路徑返回,并且將壓縮包刪除光绕。

知識點:os.join女嘲,合并路徑?

用Logger輸出日志?

用raise 輸出異常?

用tarfile解壓文件

2、 獲取人名信息target_names诞帐,人名對應(yīng)的人臉信息faces,target欣尼,首先看一下人臉數(shù)據(jù)集的結(jié)構(gòu)



由上圖可以看出lfw_funneled文件夾下包含以人名來命名的文件夾,每個人名的文件夾下都是他的人臉信息停蕉。這樣的結(jié)構(gòu)化的信息是非常友好的愕鼓。在這兒_fetch_lfw_people函數(shù)負(fù)責(zé)加載人臉數(shù)據(jù)集合人臉對應(yīng)的人名信息。


# searchsorted是尋求插入位置的函數(shù)慧起,在這兒巧妙的將person_names數(shù)字化菇晃,target代表person_names中每各名字在target_names的位置


3.加載圖片_load_imgs

_load_imgs要說的不多,主要是作者在考慮到py兼容問題時候考慮的很細(xì)致


接下來就是根據(jù)slice數(shù)據(jù)對圖片切片蚓挤,然后在resize特征臉可視化

挑選了前11個主要特征臉磺送,可視化效果圖如下:


---------------------


作者:Shane Zhao

來源:CSDN

原文:https://blog.csdn.net/silence2015/article/details/71598631

版權(quán)聲明:本文為博主原創(chuàng)文章驻子,轉(zhuǎn)載請附上博文鏈接!

(2)方法:PCA+SVM實現(xiàn)人臉識別

? ? ? PCA主要是通過奇異值分解將數(shù)據(jù)映射到低緯度的空間(正交去相關(guān))估灿。PCA在數(shù)據(jù)降維崇呵,數(shù)據(jù)壓縮,特征提取有很大貢獻(xiàn)馅袁。在此域慷,我們利用PCA提取150個主要特征,并將人臉數(shù)據(jù)全部映射到150維度汗销,通過這150維人臉特征作為訓(xùn)練數(shù)據(jù)訓(xùn)練基于rbf kernel的SVM犹褒,模型差不多有0.85的準(zhǔn)確率。

1)sklearn.decomposition.PCA(n_components=None, copy=True, whiten=False):

參數(shù)意義:

n_components:??

意義:PCA算法中所要保留的主成分個數(shù)n大溜,也即保留下來的特征個數(shù)n

類型:int 或者 string,缺省時默認(rèn)為None估脆,所有成分被保留钦奋。

? ? ? ? ? 賦值為int,比如n_components=1疙赠,將把原始數(shù)據(jù)降到一個維度付材。

? ? ? ? ? 賦值為string,比如n_components='mle'圃阳,將自動選取特征個數(shù)n厌衔,使得滿足所要求的方差百分比。

copy:

類型:bool捍岳,True或者False富寿,缺省時默認(rèn)為True。

意義:表示是否在運(yùn)行算法時锣夹,將原始訓(xùn)練數(shù)據(jù)復(fù)制一份页徐。若為True,則運(yùn)行PCA算法后银萍,原始訓(xùn)練數(shù)據(jù)的值不會有任何改變变勇,因為是在原始數(shù)據(jù)的副本上進(jìn)行運(yùn)算;若為False贴唇,則運(yùn)行PCA算法后搀绣,原始訓(xùn)練數(shù)據(jù)的值會改,因為是在原始數(shù)據(jù)上進(jìn)行降維計算戳气。

whiten:

類型:bool链患,缺省時默認(rèn)為False

意義:白化,使得每個特征具有相同的方差瓶您。

關(guān)于“白化”:

我們已經(jīng)了解了如何使用PCA降低數(shù)據(jù)維度锣险。在一些算法中還需要一個與之相關(guān)的預(yù)處理步驟蹄皱,這個預(yù)處理過程稱為白化(一些文獻(xiàn)中也叫sphering)。舉例來說芯肤,假設(shè)訓(xùn)練數(shù)據(jù)是圖像巷折,由于圖像中相鄰像素之間具有很強(qiáng)的相關(guān)性,所以用于訓(xùn)練時輸入是冗余的崖咨。白化的目的就是降低輸入的冗余性锻拘;更正式的說,我們希望通過白化過程使得學(xué)習(xí)算法的輸入具有如下性質(zhì):(i)特征之間相關(guān)性較低击蹲;(ii)所有特征具有相同的方差署拟。

2、PCA對象的屬性

components_ :返回具有最大方差的成分歌豺。

explained_variance_ratio_:返回 所保留的n個成分各自的方差百分比推穷。

n_components_:返回所保留的成分個數(shù)n。

mean_:

noise_variance_:

3类咧、PCA對象的方法

fit(X,y=None)

fit()可以說是scikit-learn中通用的方法馒铃,每個需要訓(xùn)練的算法都會有fit()方法,它其實就是算法中的“訓(xùn)練”這一步驟痕惋。因為PCA是無監(jiān)督學(xué)習(xí)算法区宇,此處y自然等于None。

fit(X)值戳,表示用數(shù)據(jù)X來訓(xùn)練PCA模型议谷。

函數(shù)返回值:調(diào)用fit方法的對象本身。比如pca.fit(X)堕虹,表示用X對pca這個對象進(jìn)行訓(xùn)練卧晓。

fit_transform(X)

用X來訓(xùn)練PCA模型,同時返回降維后的數(shù)據(jù)赴捞。

newX=pca.fit_transform(X)禀崖,newX就是降維后的數(shù)據(jù)。

inverse_transform()

將降維后的數(shù)據(jù)轉(zhuǎn)換成原始數(shù)據(jù)螟炫,X=pca.inverse_transform(newX)

transform(X)

將數(shù)據(jù)X轉(zhuǎn)換成降維后的數(shù)據(jù)波附。當(dāng)模型訓(xùn)練好后,對于新輸入的數(shù)據(jù)昼钻,都可以用transform方法來降維掸屡。

此外,還有get_covariance()然评、get_precision()仅财、get_params(deep=True)、score(X, y=None)等方法碗淌,以后用到再補(bǔ)充吧盏求。

4.GridSearchCV方法自動選擇超參數(shù)

在機(jī)器學(xué)習(xí)模型中抖锥,需要人工選擇的參數(shù)稱為超參數(shù)。比如隨機(jī)森林中決策樹的個數(shù)碎罚,人工神經(jīng)網(wǎng)絡(luò)模型中的隱藏層層數(shù)和每層的節(jié)點個數(shù)磅废,正則項中常數(shù)大小等等,它們都需要事先指定荆烈。超參數(shù)選擇不恰當(dāng)拯勉,就會出現(xiàn)欠擬合或者過擬合的問題。

我們在選擇超參數(shù)有兩個途徑:

1.憑經(jīng)驗

2.選擇不同大小的參數(shù)憔购,帶入到模型中宫峦,挑選表現(xiàn)最好的參數(shù)。

通過途徑2選擇超參數(shù)時玫鸟,可以使用Python中的GridSearchCV方法导绷,自動對輸入的參數(shù)進(jìn)行排列組合,并一一測試屎飘,從中選出最優(yōu)的一組參數(shù)妥曲。

class?sklearn.model_selection.GridSearchCV(estimator,?param_grid,?scoring=None,?fit_params=None,?n_jobs=None,?iid=’warn’,?refit=True,?cv=’warn’,?verbose=0,?pre_dispatch=‘2*n_jobs’,?error_score=’raise-deprecating’,?return_train_score=’warn’)

例如:

clf=GridSearchCV(模型,param_grid,cv=5)

clf.fit(X_train,y_train)

5.classification_report:

sklearn中的classification_report函數(shù)用于顯示主要分類指標(biāo)的文本報告.在報告中顯示每個類的精確度,召回率枚碗,F(xiàn)1值等信息逾一。

主要參數(shù):

y_true:1維數(shù)組铸本,或標(biāo)簽指示器數(shù)組/稀疏矩陣肮雨,目標(biāo)值。

y_pred:1維數(shù)組箱玷,或標(biāo)簽指示器數(shù)組/稀疏矩陣怨规,分類器返回的估計值。

labels:array锡足,shape = [n_labels]波丰,報表中包含的標(biāo)簽索引的可選列表。

target_names:字符串列表舶得,與標(biāo)簽匹配的可選顯示名稱(相同順序)掰烟。

sample_weight:類似于shape = [n_samples]的數(shù)組,可選項沐批,樣本權(quán)重纫骑。

digits:int,輸出浮點值的位數(shù).


(3)測試結(jié)果進(jìn)行顯示:

1.figure語法及操作

(1)figure語法說明

figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)

num:圖像編號或名稱九孩,數(shù)字為編號 先馆,字符串為名稱

figsize:指定figure的寬和高,單位為英寸躺彬;

dpi參數(shù)指定繪圖對象的分辨率煤墙,即每英寸多少個像素梅惯,缺省值為80

facecolor:背景顏色

edgecolor:邊框顏色

frameon:是否顯示邊框

2.subplot(nrows,ncols,index,**kwargs)

subplot(pos,**kwargs)

subplot(ax)

一個3位整數(shù)或三個獨(dú)立的整數(shù),用于描述子圖的位置仿野。如果三個整數(shù)按順序為nrows铣减,ncols和index,則子圖將采用nrows行和ncols列的網(wǎng)格上的索引位置设预。 index從左上角的1??開始向右增加徙歼。

pos是一個三位整數(shù),其中第一個數(shù)字是行數(shù)魄梯,第二個是列數(shù),第三個是子圖的索引宾符。即fig.add_subplot(235)與fig.add_subplot(2,3,5)相同呐赡。請注意退客,所有整數(shù)必須小于10才能使此表單生效。


3.rsplit

str.?rsplit([sep[, maxsplit]])

返回字符串中單詞的列表链嘀,由分隔符字符串(從右側(cè)開始)分隔萌狂。

sep

可選的。將字符串分成分組的字符;默認(rèn)是空格怀泊。

maxsplit

可選的茫藏。要做的分裂數(shù)量;默認(rèn)值為-1,它會拆分所有項目霹琼。



最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末务傲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子枣申,更是在濱河造成了極大的恐慌售葡,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糯而,死亡現(xiàn)場離奇詭異天通,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)熄驼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門像寒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烘豹,“玉大人碘赖,你說我怎么就攤上這事隐锭。” “怎么了移层?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵筷笨,是天一觀的道長憔鬼。 經(jīng)常有香客問我,道長胃夏,這世上最難降的妖魔是什么轴或? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮仰禀,結(jié)果婚禮上照雁,老公的妹妹穿的比我還像新娘。我一直安慰自己答恶,他們只是感情好饺蚊,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悬嗓,像睡著了一般污呼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上包竹,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天燕酷,我揣著相機(jī)與錄音,去河邊找鬼映企。 笑死悟狱,一個胖子當(dāng)著我的面吹牛静浴,可吹牛的內(nèi)容都是我干的堰氓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼苹享,長吁一口氣:“原來是場噩夢啊……” “哼双絮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起得问,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤囤攀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后宫纬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體焚挠,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年漓骚,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝌衔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片榛泛。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖噩斟,靈堂內(nèi)的尸體忽然破棺而出曹锨,到底是詐尸還是另有隱情,我是刑警寧澤剃允,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布沛简,位于F島的核電站,受9級特大地震影響斥废,放射性物質(zhì)發(fā)生泄漏椒楣。R本人自食惡果不足惜牡肉,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拧抖。 院中可真熱鬧唧席,春花似錦嘲驾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殃饿。三九已至乎芳,卻和暖如春谬晕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背携取。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像碰辅,于是被迫代替她去往敵國和親没宾。 傳聞我的和親對象是個殘疾皇子会钝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348