1. 程式人生 > >python入門-分類和回歸各種初級算法

python入門-分類和回歸各種初級算法

學習 -- rst dip 混淆 random bottom gin 實踐

引自:http://www.cnblogs.com/taichu/p/5251332.html

###########################

#說明:
#      撰寫本文的原因是,筆者在研究博文“http://python.jobbole.com/83563/”中發現
#      原內容有少量筆誤,並且對入門學友缺少一些信息。於是筆者做了增補,主要有:
#      1.查詢並簡述了涉及的大部分算法;
#      2.添加了連接或資源供進一步查詢;
#      3.增加了一些lib庫的基本操作及說明;
#      4.增加了必須必要的python的部分語法說明;
#      5.增加了對模型算法,數據挖掘等領域的思考和判斷;
#      6.修訂了原作者代碼上的筆誤,跑通全部程序,拷貝就可用!
#      7.其他
#      目標是:針對python是0基礎!但喜歡數據挖掘的初級學友,方面其入門,減少挫折感!
#              通過“一份帶註釋的可用代碼”來學習!
#建議:先學習,或初步瀏覽原作者的博文(如上)。 
#鏈接:筆者資源收集貼“http://www.cnblogs.com/taichu/p/5216659.html”,供新老學友參考,筆者會不斷整理更新!
###########################

###########################
#(
0)心得 # 1.因為數據的找尋,分析和建模一條龍代價不菲。 # 應該‘榨幹’一份數據和模型的每種可能性,徹底研究掌握。 # 往往能一通百通,一個模型反復折騰能用到各種方法和體會! ###########################
###########################
#(1)觀察原始數據(樣本)
#知識點:數據導入;數據可視化
###########################

##################
#在ubuntu15.10中通過如下6條命令來安裝python環境
#sudo apt-get install python   #安裝python最新版,一般已經自帶最新2.7版本了
#sudo apt-get install python-numpy    #安裝python的numpy模塊
#sudo apt-get install python-matplotlib
#sudo apt-get install python-networkx
#sudo apt-get install python-sklearn
#python #看python版本並進入交互式界面,就可以執行如下命令,全部拷貝黏貼進去試試看? #另外,可以下載Anaconda的Python IDE集成環境,搜一下非常好,很多SCIPY等核心庫都集成了,免去安裝之苦! #特別註意:筆者是WIN10宿主機上安裝Ubuntu15.10最新虛擬機,在Ubuntu中默認安裝了python,升級並安裝以上lib後實踐所有如下代碼! ##################
import urllib2
url = ‘http://aima.cs.berkeley.edu/data/iris.csv‘
u = urllib2.urlopen(url)
#以下為本地樣本存儲路徑,請根據實際情況設定!
#localfn=‘/mnt/hgfs/sharedfolder/iris.csv‘ #for linux
localfn=‘D:\\Virtual Machines\\sharedfolder\\iris.csv‘ #for windows
localf = open(localfn, ‘w‘)
localf.write(u.read())
localf.close()
# data examples
#COL1,  COL2,   COL3,   COL4,   COL5
#5.1    3.5    1.4    0.2    setosa
#…    …    …    …    …
#4.7    3.2    1.3    0.2    setosa
#7    3.2    4.7    1.4    versicolor
#…    …    …    …    …
#6.9    3.1    4.9    1.5    versicolor
#6.3    3.3    6    2.5    virginica
#…    …    …    …    …
#7.1    3    5.9    2.1    virginica

#############################
#U can get description of ‘iris.csv‘ 
#at ‘http://aima.cs.berkeley.edu/data/iris.txt‘
#Definiation of COLs:
#1. sepal length in cm (花萼長)
#2. sepal width in cm(花萼寬)
#3. petal length in cm (花瓣長)
#4. petal width in cm(花瓣寬)
#5. class: 
#      -- Iris Setosa
#      -- Iris Versicolour
#      -- Iris Virginica
#Missing Attribute Values: None
#################################
from numpy import genfromtxt, zeros
# read the first 4 columns
data = genfromtxt(localfn,delimiter=‘,‘,usecols=(0,1,2,3)) 
# read the fifth column
target = genfromtxt(localfn,delimiter=‘,‘,usecols=(4),dtype=str)

print data.shape
# output: (150, 4)
print target.shape
# output: (150,)

#auto build a collection of unique elements
print set(target)  
# output: set([‘setosa‘, ‘versicolor‘, ‘virginica‘])
#print set(data) #wrong usage of set, numbers is unhashable
######################
#plot庫用法簡述:
#‘bo‘=blue+circle; ‘r+‘=red+plus;‘g‘=red+*
#search keyword ‘matlab plot‘ on web for details
#http://www.360doc.com/content/15/0113/23/16740871_440559122.shtml
#http://zhidao.baidu.com/link?url=6JA9-A-UT3kmslX1Ba5uTY1718Xh-OgebUJVuOs3bdzfnt4jz4XXQdAmvb7R5JYMHyRbBU0MYr-OtXPyKxnxXsPPkm9u5qAciwxIVACR8k7
######################
#figure for 2D data
from pylab import plot, show
plot(data[target==‘setosa‘,0],data[target==‘setosa‘,2],‘bo‘)
plot(data[target==‘versicolor‘,0],data[target==‘versicolor‘,2],‘r+‘)
plot(data[target==‘virginica‘,0],data[target==‘virginica‘,2],‘g*‘)
show()

#註意:如果在Ubuntu的python交互式環境下運行,則figure會打斷程序的RUN.
#如果你用Anaconda的spyder(Python2.7)則方便的多,生成的figure會自動輸出到console
#且不會打斷程序運行!

#figure for all 4D(4個維度) data, 同色一類,圈是花萼,加號花瓣
setosa_sepal_x=ssx=data[target==‘setosa‘,0]
setosa_sepal_y=ssy=data[target==‘setosa‘,1]
setosa_petal_x=spx=data[target==‘setosa‘,2]
setosa_petal_y=spy=data[target==‘setosa‘,3]

versicolor_sepal_x=vsx=data[target==‘versicolor‘,0]
versicolor_sepal_y=vsy=data[target==‘versicolor‘,1]
versicolor_petal_x=vpx=data[target==‘versicolor‘,2]
versicolor_petal_y=vpy=data[target==‘versicolor‘,3]

virginica_sepal_x=vgsx=data[target==‘virginica‘,0]
virginica_sepal_y=vgsy=data[target==‘virginica‘,1]
virginica_petal_x=vgpx=data[target==‘virginica‘,2]
virginica_petal_y=vgpy=data[target==‘virginica‘,3]

plot(ssx,ssy,‘bo‘,spx,spy,‘b+‘)
plot(vsx,vsy,‘ro‘,vpx,vpy,‘r+‘)
plot(vgsx,vgsy,‘go‘,vgpx,vgpy,‘g+‘)
show()
#figure for 1D(花萼的長度),三類長度及平均值的直方圖
#pylab詳細用法參考如下
#http://hyry.dip.jp/tech/book/page/scipy/matplotlib_fast_plot.html
from pylab import figure, subplot, hist, xlim, show
xmin = min(data[:,0])
xmax = max(data[:,0])
figure() #可省略,默認會生成一個figure
subplot(411) # distribution of the setosa class (1st, on the top)
hist(data[target==‘setosa‘,0],color=‘b‘,alpha=.7)
xlim(xmin,xmax)
#subplot(行,列,plot號);(4,1,2)合並為412,都小於10可合成
subplot(412) # distribution of the versicolor class (2nd)
hist(data[target==‘versicolor‘,0],color=‘r‘,alpha=.7)
xlim(xmin,xmax)
subplot(413) # distribution of the virginica class (3rd)
hist(data[target==‘virginica‘,0],color=‘g‘,alpha=.7)
xlim(xmin,xmax)
subplot(414) # global histogram (4th, on the bottom)
hist(data[:,0],color=‘y‘,alpha=.7)
xlim(xmin,xmax)
show()
###########################
#(2)樣本分類
# 樸素貝葉斯分類器是常用的一種,分為(高斯模型/非多項式模式/非伯努利模式)
###########################
#仿造target陣列(1維)弄出全0的t陣列
t = zeros(len(target))
#type(t) #show type of t (numpy.ndarray)
#print t #show contains of t
#將target陣列中特定元素的位置設置為1(真簡潔)
t[target == ‘setosa‘] = 1
t[target == ‘versicolor‘] = 2
t[target == ‘virginica‘] = 3
#print t

#用全部data集來做訓練
from sklearn.naive_bayes import GaussianNB
classifier = cf = GaussianNB()
cf.fit(data,t) # training on the iris dataset
print cf.predict(data[0]) #訓練完分類1條數據
#output:[ 1.]
print t[0]
#output:1.0

#從原始數據data中劃分為訓練集和驗證集,t也做同樣劃分
from sklearn import cross_validation
train, test, t_train, t_test = cross_validation.train_test_split(data, t, test_size=0.4, random_state=0)

print train.shape
#output:(90, 4)
print test.shape
#output:(60, 4)
print t_train.shape
#output:(90,)
print t_test.shape
#output:(60,)

#用60%數據訓練後,再用40%數據驗證,得到93.3%
cf.fit(train,t_train) # train
print cf.score(test,t_test) # test
#output:0.93333333333333335
cf.score(train,t_train) #用訓練集訓練後同樣用它測試居然不是100%分類!
#output:0.97777777777777775

#用全部數據訓練後,同樣用它測試,結果低於剛才97%
cf.fit(data,t)
#output:GaussianNB()
cf.score(data,t)
#output:0.95999999999999996


#用100%數據訓練後,再用40%數據驗證,得到94.99%
cf.fit(data,t)
#output:GaussianNB()
cf.score(test,t_test)
#output:0.94999999999999996

###########################################################
#TODO:研究計劃(筆者會另立博文研究此問題)
#因為樸素貝葉斯分類法基於每個feature都是概率獨立不相關。但其實相關,可嘗試:
#1.顯然花萼長寬,花瓣的長寬,是很強的相關性,形成2個新feature;為sepal-size,petal-size
#2.花萼與花瓣的長度合並,寬度合並,可能也有相關性,形成2個新feature!為whole-length,whole-wide
#3.原來花萼長與寬,花瓣長與寬,就是4個初始feature;
#4.以上初步判斷的8個feature的組合關系?舉例:一種花,就是花瓣很小,花萼較大呢?生物學有必然比例ratio嗎?
#  再比如,一種花整體都很修長?或矮短?
#  我們也懷疑sepal-size和petal-size有一定的概率聯系(正相關或負相關或某種關系)
#  即使分類器做到了100%,對未來樣本的分類也不一定100%正確,因為樣本的收集也存在標定誤差(人為錄入誤差)
#TRY:嘗試變更模型,數據轉換後,再次做分類測試,交叉驗證,期望提升準確率!
#############################################################
#用混淆矩陣估計分類器表現
from sklearn.metrics import confusion_matrix
print confusion_matrix(cf.predict(test),t_test)
#output:[[16  0  0]
#output: [ 0 23  4]
#output: [ 0  0 17]]
#混淆矩陣簡單說明
#        預測情況
#        -----------
#        類1 類2 類3
#實 |類1 43  5   2
#際 |類2 2   45  3
#情 |類3 0   1   49
#況 |
#
#說明:正確的猜測都在表格的對角線
#解讀:實際情況是3個類每個都50個樣本;
#      類3有1個錯誤的猜測為類2;
#      類2有2個錯誤的猜測為類1,3個錯誤的識別為類3
#      類1有5個錯誤的猜測為類2,2個錯誤的識別為類3

#分類器性能的完整報告
#Precision:正確預測的比例
#Recall(或者叫真陽性率):正確識別的比例
#F1-Score:precision和recall的調和平均數
from sklearn.metrics import classification_report
print classification_report(classifier.predict(test), t_test, target_names=[‘setosa‘, ‘versicolor‘, ‘virginica‘])
#output:            precision    recall  f1-score   support
#output:    setosa       1.00      1.00      1.00        16
#output:versicolor       1.00      0.85      0.92        27
#output: virginica       0.81      1.00      0.89        17
#output:avg / total      0.95      0.93      0.93        60

##############################################################
#補充調和平均數知識點
#調和平均數:Hn=n/(1/a1+1/a2+...+1/an)
#幾何平均數:Gn=(a1a2...an)^(1/n)
#算術平均數:An=(a1+a2+...+an)/n
#平方平均數:Qn=√ [(a1^2+a2^2+...+an^2)/n]
#這四種平均數滿足 Hn ≤ Gn ≤ An ≤ Qn
#
#調和平均數典型舉例:
#問:有4名學生分別在一個小時內解題3、4、6、8道,求平均解題速度多少(1小時能解幾道)?
#答:就是求調和平均數,即1/[(1/3+1/4+1/6+1/8)/4]=4/(1/3+1/4+1/6+1/8)=4.57 
###########################################################


#以上僅僅只是給出用於支撐測試分類的數據量。
#分割數據、減少用於訓練的樣本數以及評估結果等操作
#都依賴於配對的訓練集和測試集的隨機選擇


#如果要切實評估一個分類器並與其它的分類器作比較的話,
#我們需要使用一個更加精確的評估模型,例如Cross Validation。
#該模型背後的思想很簡單:多次將數據分為不同的訓練集和測試集,
#最終分類器評估選取多次預測的平均值。
#sklearn為我們提供了運行模型的方法:

from sklearn.cross_validation import cross_val_score
# cross validation with 6 iterations 
scores = cross_val_score(classifier, data, t, cv=6)
print scores
#output:[ 0.92592593  1.          0.91666667  0.91666667  0.95833333  1.        ]

#並非叠代越多次越好。當前CV=6,叠代6次

#輸出是每次模型叠代產生的精確度的數組。我們可以很容易計算出平均精確度:
from numpy import mean
print mean(scores)
#output:0.96
#循環不斷增加叠代cv次數,並輸出mean值
#叠代CV必須>=2,否則報錯‘ValueError: k-fold cross validation requires at least one train / test split by setting n_folds=2 or more, got n_folds=1.‘
#叠代CV必須小於最小的一個樣本數目(對t=50;t_train=27;t_test=16),詳見後面ndarray歸類打印!
#1.窮舉data的所有叠代cv可能的交叉驗證平均值並打印
for i in range(2, 51):
  scores = cross_val_score(classifier, data, t, cv=i)
  print mean(scores)#每句for語句在交互式界面必須跟一行空行(沒任何字符包括空格)才能表示輸入結束!
#2.窮舉test的所有叠代cv可能的交叉驗證平均值並打印 
for i in range(2, 17): print mean(cross_val_score(classifier, test, t_test, cv=i))
#3.窮舉train的所有叠代cv可能的交叉驗證平均值並打印
for i in range(2, 28): print mean(cross_val_score(classifier, train, t_train, cv=i))
#對一維numpy.ndarray數字值歸類並打印
ndarray={}
for item in t: ndarray[item] = ndarray.get(item, 0) + 1
#下面必須有一行空行(沒任何空格!),讓交互式python確認for語句完成輸入
print(ndarray)
#output:{1.0: 50, 2.0: 50, 3.0: 50}

#對一維numpy.ndarray數字值歸類並打印
ndarray={}
for item in t_train: ndarray[item] = ndarray.get(item, 0) + 1
    #下面必須有一行空行,讓交互式python確認for語句完成輸入

print(ndarray)
#output:{1.0: 34, 2.0: 27, 3.0: 29}

#對一維numpy.ndarray數字值歸類並打印
ndarray={}
for item in t_test: ndarray[item] = ndarray.get(item, 0) + 1
    #下面必須有一行空行,讓交互式python確認for語句完成輸入

print(ndarray)
#output:{1.0: 16, 2.0: 23, 3.0: 21}
#***********************************
#附加內容:寫一個循環,從1和n-1到n-1和1來劃分訓練集和驗證集;
#TODO:    並對每種劃分應用model(此處是樸素貝葉斯分類器-高斯模型)訓練後交叉驗證;
#          交叉驗證時也窮舉所有可能的cv叠代次數;
#          收集數據並顯示,看此model對已知數據集合的分類最優點在哪裏?
#          figure的X是train/data(訓練集合占比%)(0,1);Y軸交叉驗證mean值的叠代窮舉後均值!(0,1)
#          因為訓練集和驗證集劃分每次是隨機的,每RUN一次會有一張不同的二維圖
#TODO:    進一步擴展,對一個矩陣樣本,能否自動的按照一定規律,窮舉各種算法模型的結果?
#          並能設定閾值報警。這樣我們就有個一個遍歷所有算法的基礎toolbox,對原始矩陣樣式的樣本
#          做自動auto的掃描,提供基本的信息和情況,然後再人為去研究。
#***********************************
###########################
#(3)聚類
###########################
#k-means算法簡介:算法接受輸入量k ,並將n個數據對象分為k個聚類;獲得的聚類滿足:同一聚類中的對象相似度較高;不同聚類中對象相似度低;
#                聚類相似度是利用各聚類中對象的均值所獲得一個“中心對象”(引力中心)來進行計算。
#k-means 算法基本步驟:
#(1) 從 n個數據對象任意選擇k個對象作為初始聚類中心(最終期望聚為k類);
#(2) 根據每個聚類對象的均值(中心對象),計算每個對象與這些中心對象的距離;按最小距離重新對相應對象進行劃分;
#(3) 重新計算每個(有變化)聚類的均值(中心對象);
#(4) 計算標準測度函數,當滿足一定條件,如函數收斂時,則算法終止;如果條件不滿足則回到步驟(2)。
############################
from sklearn.cluster import KMeans
kms = KMeans(n_clusters=3) # initialization 先驗知道3種植物,所以設定引力中心為聚合成3類。
#kmeans = KMeans(k=3, init=random) # both parameters are wrong
kms.fit(data) # actual execution
c = kms.predict(data)

from sklearn.metrics import completeness_score, homogeneity_score
print completeness_score(t,c)
#output:0.764986151449
print homogeneity_score(t,c)
#output:0.751485402199
#特別註意!t中只要是3類值就行,不一定非要1,2,3
#當大部分數據點屬於一個給定的類並且屬於同一個群集,那麽完整性得分就趨向於1。
#當所有群集都幾乎只包含某個單一類的數據點時同質性得分就趨向於1.
figure()
subplot(211) # top figure with the real classes
plot(data[t==1,0],data[t==1,2],bo)
plot(data[t==2,0],data[t==2,2],ro)
plot(data[t==3,0],data[t==3,2],go)
subplot(212) # bottom figure with classes assigned automatically
plot(data[c==1,0],data[c==1,2],bo,alpha=.5)
plot(data[c==2,0],data[c==2,2],go,alpha=.5)
plot(data[c==0,0],data[c==0,2],mo,alpha=.5)
show()
#觀察此圖我們可以看到,底部左側的群集可以被k-means完全識別,
#然而頂部的兩個群集有部分識別錯誤。按照kmean的中心對象是引力中心的聚類方法
#出現識別錯誤是必然的;樣本的偶然性可能導致識別錯誤

#如下是將4個feature維度組合為2個點放入一個平面,也可以看到聚類為3種後,
#邊界變得清晰了。
import matplotlib.pyplot as plt
plt.figure()
plt.subplot(211) # top figure with the real classes
plt.plot(data[t==1,0],data[t==1,1],bo,data[t==1,2],data[t==1,3],b+)
plt.plot(data[t==2,0],data[t==2,1],ro,data[t==2,2],data[t==2,3],r+)
plt.plot(data[t==3,0],data[t==3,1],go,data[t==3,2],data[t==3,3],g+)
plt.subplot(212) # bottom figure with classes assigned automatically
plt.plot(data[c==0,0],data[c==0,1],bo,data[c==0,2],data[c==0,3],b+,alpha=.7)
plt.plot(data[c==1,0],data[c==1,1],ro,data[c==1,2],data[c==1,3],r+,alpha=.7)
plt.plot(data[c==2,0],data[c==2,1],go,data[c==2,2],data[c==2,3],g+,alpha=.7)
p=plt
fig=plt.gcf()
fig.show() # p.show()也可,但二者只能執行一次。

###########################
#(4)回歸
###########################

#回歸是一個用於預測變量之間函數關系調查的方法。
#假設有兩個變量:一個被認為是因,一個被認為是果。
#回歸模型描述兩者關系;從一個變量推斷另一個變量;
#當這種關系是一條線時,稱為線性回歸。


##############
#sklear.linear_model模塊中的LinearRegression模型。
#它通過計算每個數據點到擬合線的垂直差的平方和,
#找到平方和最小的最佳擬合線。類似sklearn模型;
#
##############

#下面舉例隨機產生了40個點樣本,但大致函數趨勢是
#在第一象限線性增長,用線性回歸來找出擬合線並評估
#Step1-隨機產生第一象限40個點
from numpy.random import rand
x = rand(40,1) # explanatory variable
y = x*x*x+rand(40,1)/5 # depentend variable

#Step2-線性回歸
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
linreg.fit(x,y)

#Step3-隨機產生x變量,用線性回歸模型推斷y變量(推斷出來是一條線)
from numpy import linspace, matrix
#產生0到1之間40個樣本值
randx = linspace(0,1,40) 
#用隨機產生的40個x軸樣本,用線性回歸預測其y軸樣本,並輸出比較
#推斷y時先將x當做矩陣轉置為y再推斷
plot(x,y,o,randx,linreg.predict(matrix(randx).T),--r)
show()

#Step4-通過測量MSE指標看擬合線與真實數據的距離平方。0最好
from sklearn.metrics import mean_squared_error
print mean_squared_error(linreg.predict(x),y)
#########################
#針對本例實際花萼的長寬數據做線性回歸
#########################
#獲取x和y(需要reshape來轉換數組(50,)到一維矩陣(50,1),才能做linreg.fit!
ssx_blue=data[target==setosa,0].reshape((50,1)) #獲取setosa的sepal花萼length
ssy_blue=data[target==setosa,1].reshape((50,1)) #獲取setosa的sepal花萼width

#用x和y獲得線性回歸模型
linreg = LinearRegression()
linreg.fit(ssx_blue,ssy_blue)

#隨機產生x變量,用線性回歸模型推斷y變量(推斷出來是一條線)
#根據經驗藍色品種setosa的花萼sepal的長寬尺寸一般為X:[4.0-6.0]y:[2.5-4.5]
randx = linspace(4.0,6.0,50) 
plot(ssx_blue,ssy_blue,o,randx,linreg.predict(matrix(randx).T),--r)
show()

#通過測量MSE指標看擬合線與真實數據的距離平方。0最好
print mean_squared_error(linreg.predict(ssx_blue),ssy_blue)
###########################
#(5)相關性分析
###########################

#通過研究feature之間的相關性來理解變量之間是否相關,相關強弱。
#相關性分析幫助定位被依賴的重要變量。最好的相關方法可能是皮爾遜積矩相關系數。
#它是由兩個變量的協方差除以它們的標準差的乘積計算而來。
#我們將鳶尾花數據集的4個變量兩兩組合計算出其相關性系數。
#特別說明:feature是可以組合與變換的,所以不一定是未處理的初始feature兩兩做相關性判斷,
#          而可能是人為判斷有相關性的,嘗試組合或變換feature再不斷測試相關性。

#當值一起增長時相關性為正。當一個值減少而另一個值增加時相關性為負。
#1代表完美的正相關,0代表不相關,-1代表完美的負相關。

#本例紅色被關聯為最高的正相關,可以看出最強相關是:
#“花瓣寬度”petal width和“花瓣長度”petal length這兩個變量。
from numpy import corrcoef
corr = corrcoef(data.T) # .T gives the transpose
print corr
#output:[[ 1.         -0.10936925  0.87175416  0.81795363]
#output: [-0.10936925  1.         -0.4205161  -0.35654409]
#output: [ 0.87175416 -0.4205161   1.          0.9627571 ]
#output: [ 0.81795363 -0.35654409  0.9627571   1.        ]]

from pylab import pcolor, colorbar, xticks, yticks
from numpy import arange
pcolor(corr) #添加相關性矩陣,4個屬性所以是4x4
colorbar() #添加彩色註釋條
#添加X,Y軸註釋,默認一個屬性是1,坐標是1,2,3,4,對應四個屬性name如下。
xticks(arange(1,5),[sepal length,  sepal width, petal length, petal width],rotation=-20)
yticks(arange(1,5),[sepal length,  sepal width, petal length, petal width],rotation=-45)
show()
###########################
#(6)成分分析(降維)
# 涉及算法之一PCA
###########################
from sklearn.decomposition import PCA
#降維到更少feature(主成分)不僅僅是為了可視化
#雖然3D也可以看,但不直觀,最直觀的是2D平面圖,而4D或更高維人眼無法觀察
#所以將data中原始4個feature降維到2維來觀察。
#特別註意:它等於自動的將feature做了算法組合,以期望分離不同種類。
pca = PCA(n_components=2)

pcad = pca.fit_transform(data)

plot(pcad[target==setosa,0],pcad[target==setosa,1],bo)
plot(pcad[target==versicolor,0],pcad[target==versicolor,1],ro)
plot(pcad[target==virginica,0],pcad[target==virginica,1],go)
show()

#查看主成分PC
print pca.explained_variance_ratio_
#output: [ 0.92461621  0.05301557]
pc1, pc2 = pca.explained_variance_ratio_ #保存2個PC

print 1-sum(pca.explained_variance_ratio_)
#output:0.0223682249752
print 1.0-pc1-pc2 #等價於上述輸出

#逆變換還原數據
data_inv = pca.inverse_transform(pcad)
#比較還原後數據和原始數據的相似度
print abs(sum(sum(data - data_inv)))
#output:6.66133814775e-15

#循環嘗試:PC數量從1維到4維(原始數據也是4維)
#看PCA覆蓋信息量;4個肯定100%,3個也很高了;
for i in range(1,5):
    pca = PCA(n_components=i)
    pca.fit(data)
    print sum(pca.explained_variance_ratio_) * 100,%

#output:92.4616207174 %
#output:97.7631775025 %
#output:99.481691455 %
#output:100.0 %




print "END"
#END



 

python入門-分類和回歸各種初級算法