Python 2.7
IDE Pycharm 5.0.3
numpy 1.11.0
matplotlib 1.5.1
本次可視化資料由機器學習實戰傾情提供(就是盜用了資料和改了一點點程式更加易讀) 前言
將txt中資料進行可視化展示用於分析需求
你只需要知道
每行的第一列資料是飛行裡程,第二列是玩遊戲所佔百分比時間,第三列是每年吃的冰激淩消耗量,第四列是某個xx覺得這類人的適合約會的感興趣程度,也就是說啦,他一年飛40920公裡,有百分之八左右的時間在玩遊戲,每年還要吃掉0.9公升哦,這個對象xx覺得好有魅力,非常想和它約會呢,就是這個意思。 準備食材
剛下載下來的txt是左邊那個,第四列也就是類別了,但是中文怎麼轉化為右邊那個數值強度呢。還是挺簡單的,掃描每一行的時候把判斷相等字串直接替換就可以了,詳細請看如下程式碼片段,這裡單獨拿出來看一下。
#將評價轉化為數字 if listFromLine[3] == 'largeDoses': listFromLine[3] =3 elif listFromLine[3] == 'smallDoses': listFromLine[3]=2 else: listFromLine[3]=1
經過轉化之後,形式應該和右邊那個一樣了,非常想約會是3,一般是2,不想是1,就醬紫。這也就是類別了。 從txt到存入array數組
我現在接觸到的儲存在txt中資料的有(大)資料處理:從txt到MySql的資料預先處理遷徙中的北京市一個月的出租車GPS資料(350G),高光譜資料AVIRIS遙感映像資料(.mat)也是可以轉化為txt的,所以如何將txt資料清洗後存入到array也好,存入到database也好,這都是資料處理後續工作避不開的前提,廢話不多說,開始。 完整代碼
# -*- coding: utf-8 -*-from numpy import *import matplotlib.pyplot as pltdef file2matrix(filename): fr = open(filename,'r') arrayOlines = fr.readlines() numberOfLines = len(arrayOlines) returnMat = zeros((numberOfLines,3)) #構造全零陣來存放數 classLabelVector = [] #開闢容器 index = 0 for line in arrayOlines: #清洗資料 line = line.strip() listFromLine = line.split('\t') #將評價轉化為數字 if listFromLine[3] == 'largeDoses': listFromLine[3] =3 elif listFromLine[3] == 'smallDoses': listFromLine[3]=2 else: listFromLine[3]=1 #存入資料到list returnMat[index,:] = listFromLine[0:3] #三個特徵分別存入一行的三個列 classLabelVector.append(int(listFromLine[3])) #最後一行是類別標籤 index +=1 return returnMat,classLabelVector#將喜歡強度轉化為顏色def ColorOfDatingLable(num): datingLabels_rgb = [] for i in range(len(num)): if num[i]==3: datingLabels_rgb.append('red') elif num[i]==2: datingLabels_rgb.append('green') else: datingLabels_rgb.append('black') return datingLabels_rgbdatingDataMat,datingLabels = file2matrix('C:\\Users\\MrLevo\\Desktop\\machine_learning_in_action\\Ch02\\datingTestSet.txt')##################建立圖表1#####################plt.figure(1) #建立圖表1ax1 = plt.subplot(1,2,1) # 圖表1中建立子圖1plt.title("original color")plt.xlabel('play game/time %')plt.ylabel('ice cream cost/week')ax2 = plt.subplot(1,2,2) # 圖表1中建立子圖2plt.title("improved color")plt.xlabel('play game/time %')plt.ylabel('ice cream cost/week')###################建立圖表2####################plt.figure(2) #建立圖表2ax3 = plt.subplot(2,2,1) # 圖表2中建立子圖1plt.title("play game & ice cream cost")plt.xlabel('play game/time %')plt.ylabel('ice cream cost/week')ax4 = plt.subplot(2,2,2) # 圖表2中建立子圖2plt.title("fly distance & play game")plt.xlabel('fly distance/year')plt.ylabel('play game/time %')ax5 = plt.subplot(2,2,3) # 圖表2中建立子圖2plt.title("fly distance & ice cream cost")plt.xlabel('fly distance/year')plt.ylabel('ice cream cost/week')#plt.scatter(x[i],y[i],marker = 樣式,s=大小半徑,color =(np.random.rand(1,3)),label = str(i+1))ax1.scatter(datingDataMat[:,1],datingDataMat[:,2],15*array(datingLabels),15*array(datingLabels)) #scatter散佈圖展示第二列和第三列資料ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels)) #scatter散佈圖展示第二列和第三列資料,第一個15*array(datingLabels)用來表現不同標籤的不同半徑ax3.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels),label='largeDoses/smallDoses/didntLike')ax4.scatter(datingDataMat[:,0],datingDataMat[:,1],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels),label='largeDoses/smallDoses/didntLike')ax5.scatter(datingDataMat[:,0],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels),label='largeDoses/smallDoses/didntLike')ax3.legend(loc='upper right')ax4.legend(loc='upper right')ax5.legend(loc='upper right')plt.show()
產生的效果圖如下
對比圖分析
從上圖中可以看出,紅點的密集地區以及各個維度之間的聯絡,其中吃不吃冰激淩,這個貌似並不能作為評判的影響性因素,因為冰激淩量的多少,完全符合了均勻分布。唯一有價值的算是第二幅圖,我們可以看出,飛行時間在40000左右,玩遊戲時間所佔比例為10%左右,xx女士比較喜歡這樣類型的男士,並且表現出了極大興趣,而飛行時間過長,或者遊戲時間很短,卻不受她的青睞,我們這裡揣測一下xx女士的想法,她喜歡的類型應該是比較活潑的,見多識廣,但又能不經常出差希望陪伴在自己身邊的男士,從飛行距離上看出,適當的旅行能增長見識,會更有趣,而過長的飛行時間,只能表明,他要麼在出差,要麼就屬於那種全世界遊玩的人,這樣的不定性而缺乏安全感,我想這也就是xx女士並不喜歡這類男士的原因吧,而飛行時間很短,缺乏對外界的認識,讓xx女士覺得這類男士缺乏見識和有趣度,你想,一個常年待在家的人,會有多少有趣呢,俗話說得好,讀萬卷書不如行萬裡路,我想也是xx女士判別一個人是否有趣的因素吧,而遊戲時間上來說,過短的遊戲時間,可能會讓xx女士認為男士缺乏幽默,激情,智商的表現,畢竟遊戲很多都是對一個人反應能力,情商,布局能力的各方面體現,所以,xx女士認為一個不玩遊戲,並且飛行距離超長的男士,只能判斷為長期出差在外,所以並不喜歡這類,而她對那些‘死宅’卻保持著一般的興趣,這點說明,死宅也有春天啊,哈哈哈。 改進代碼
畫散點陣scatter來說,它的參數設定是這樣的:
#plt.scatter(x[i],y[i],marker = 樣式,s=大小半徑,color =顏色,label = 點備忘
而書中的有一行代碼是這樣的,我相信也有小夥伴們覺得這個很奇怪:
ax1.scatter(datingDataMat[:,1],datingDataMat[:,2],15*array(datingLabels),15*array(datingLabels)) #scatter散佈圖展示第二列和第三列資料
第一個好理解,15*array(datingLabels)它來規定點的尺度大小,而第二個的15*array(datingLabels)來表示顏色。很抱歉,我尋找scatter顏色參數的過程中,沒有看到這個表示方法的,可能我沒找到吧,如果有人知道請告訴我一聲為什麼可以這麼表示顏色。我目前知道的表示顏色的參數可以有類似“r”,或者三原色的數值表示的,並沒有看到單數值表示的。所以我改進了一下,寫了個ColorOfDatingLable函數,裡面是將數值轉換為顏色值對應起來。所用的語句是這個
ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels)) #scatter散佈圖展示第二列和第三列資料,第一個15*array(datingLabels)用來表現不同標籤的不同半徑
他們兩的對比圖我也放在一塊比較了,如圖顯示
相比較而言,修改後的圖更加清晰,特色明顯。 你可能還需要知道 一些numpy的常用方式,請見numpy快速入門 matplotlib的常用例子,致謝@星星點燈–Python圖表繪製:matplotlib繪圖庫入門 它來自於機器學習之K-近鄰演算法(Python描述)基礎並且只是其中處理資料的一部分 matplotlib官方文檔 致謝
numpy快速入門
@星星點燈–Python圖表繪製:matplotlib繪圖庫入門
@MrLevo520–機器學習之K-近鄰演算法(Python描述)基礎
matplotlib官方文檔
@MrLevo520–(大)資料處理:從txt到MySql的資料預先處理遷徙