Python 2.7
IDE Pycharm 5.0.3
numpy 1.11.0
matplotlib 1.5.1
本次可視化數(shù)據(jù)由機器學(xué)習(xí)實戰(zhàn)傾情提供(就是盜用了數(shù)據(jù)和改了一點點程序更加易讀)
前言
將txt中數(shù)據(jù)進行可視化展示用于分析需求
你只需要知道
每行的第一列數(shù)據(jù)是飛行里程莺奔,第二列是玩游戲所占百分比時間培漏,第三列是每年吃的冰激凌消耗量炉擅,第四列是某個xx覺得這類人的適合約會的感興趣程度宙攻,也就是說啦陷嘴,他一年飛40920公里蠢涝,有百分之八左右的時間在玩游戲乏苦,每年還要吃掉0.9公升哦蛉顽,這個對象xx覺得好有魅力,非常想和它約會呢矾端,就是這個意思掏击!
準(zhǔn)備食材
剛下載下來的txt是左邊那個秩铆,第四列也就是類別了砚亭,但是中文怎么轉(zhuǎn)化為右邊那個數(shù)值強度呢灯变?還是挺簡單的,掃描每一行的時候把判斷相等字符串直接替換就可以了捅膘,詳細(xì)請看如下代碼片段添祸,這里單獨拿出來看一下。
#將評價轉(zhuǎn)化為數(shù)字
if listFromLine[3] == 'largeDoses':
listFromLine[3] =3
elif listFromLine[3] == 'smallDoses':
listFromLine[3]=2
else:
listFromLine[3]=1
經(jīng)過轉(zhuǎn)化之后寻仗,形式應(yīng)該和右邊那個一樣了刃泌,非常想約會是3,一般是2署尤,不想是1耙替,就醬紫。這也就是類別了沐寺。
從txt到存入array數(shù)組
我現(xiàn)在接觸到的保存在txt中數(shù)據(jù)的有(大)數(shù)據(jù)處理:從txt到MySql的數(shù)據(jù)預(yù)處理遷徙中的北京市一個月的出租車GPS數(shù)據(jù)(350G)林艘,高光譜數(shù)據(jù)AVIRIS遙感圖像數(shù)據(jù)(.mat)也是可以轉(zhuǎn)化為txt的,所以如何將txt數(shù)據(jù)清洗后存入到array也好混坞,存入到database也好狐援,這都是數(shù)據(jù)處理后續(xù)工作避不開的前提,廢話不多說究孕,開始啥酱。
完整代碼
# -*- coding: utf-8 -*-
from numpy import *
import matplotlib.pyplot as plt
def file2matrix(filename):
fr = open(filename,'r')
arrayOlines = fr.readlines()
numberOfLines = len(arrayOlines)
returnMat = zeros((numberOfLines,3)) #構(gòu)造全零陣來存放數(shù)
classLabelVector = [] #開辟容器
index = 0
for line in arrayOlines:
#清洗數(shù)據(jù)
line = line.strip()
listFromLine = line.split('\t')
#將評價轉(zhuǎn)化為數(shù)字
if listFromLine[3] == 'largeDoses':
listFromLine[3] =3
elif listFromLine[3] == 'smallDoses':
listFromLine[3]=2
else:
listFromLine[3]=1
#存入數(shù)據(jù)到list
returnMat[index,:] = listFromLine[0:3] #三個特征分別存入一行的三個列
classLabelVector.append(int(listFromLine[3])) #最后一行是類別標(biāo)簽
index +=1
return returnMat,classLabelVector
#將喜歡強度轉(zhuǎn)化為顏色
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_rgb
datingDataMat,datingLabels = file2matrix('C:\\Users\\MrLevo\\Desktop\\machine_learning_in_action\\Ch02\\datingTestSet.txt')
##################創(chuàng)建圖表1#####################
plt.figure(1) #創(chuàng)建圖表1
ax1 = plt.subplot(1,2,1) # 圖表1中創(chuàng)建子圖1
plt.title("original color")
plt.xlabel('play game/time %')
plt.ylabel('ice cream cost/week')
ax2 = plt.subplot(1,2,2) # 圖表1中創(chuàng)建子圖2
plt.title("improved color")
plt.xlabel('play game/time %')
plt.ylabel('ice cream cost/week')
###################創(chuàng)建圖表2####################
plt.figure(2) #創(chuàng)建圖表2
ax3 = plt.subplot(2,2,1) # 圖表2中創(chuàng)建子圖1
plt.title("play game & ice cream cost")
plt.xlabel('play game/time %')
plt.ylabel('ice cream cost/week')
ax4 = plt.subplot(2,2,2) # 圖表2中創(chuàng)建子圖2
plt.title("fly distance & play game")
plt.xlabel('fly distance/year')
plt.ylabel('play game/time %')
ax5 = plt.subplot(2,2,3) # 圖表2中創(chuàng)建子圖2
plt.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散點圖展示第二列和第三列數(shù)據(jù)
ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels)) #scatter散點圖展示第二列和第三列數(shù)據(jù),第一個15*array(datingLabels)用來表現(xiàn)不同標(biāo)簽的不同半徑
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()
產(chǎn)生的效果圖如下
對比圖分析
從上圖中可以看出,紅點的密集區(qū)域以及各個維度之間的聯(lián)系厨诸,其中吃不吃冰激凌镶殷,這個貌似并不能作為評判的影響性因素,因為冰激凌量的多少微酬,完全符合了均勻分布绘趋。唯一有價值的算是第二幅圖,我們可以看出颗管,飛行時間在40000左右陷遮,玩游戲時間所占比例為10%左右,xx女士比較喜歡這樣類型的男士垦江,并且表現(xiàn)出了極大興趣帽馋,而飛行時間過長,或者游戲時間很短比吭,卻不受她的青睞绽族,我們這里揣測一下xx女士的想法,她喜歡的類型應(yīng)該是比較活潑的衩藤,見多識廣吧慢,但又能不經(jīng)常出差希望陪伴在自己身邊的男士,從飛行距離上看出赏表,適當(dāng)?shù)穆眯心茉鲩L見識娄蔼,會更有趣怖喻,而過長的飛行時間底哗,只能表明岁诉,他要么在出差,要么就屬于那種全世界游玩的人跋选,這樣的不定性而缺乏安全感涕癣,我想這也就是xx女士并不喜歡這類男士的原因吧,而飛行時間很短前标,缺乏對外界的認(rèn)識坠韩,讓xx女士覺得這類男士缺乏見識和有趣度,你想炼列,一個常年待在家的人只搁,會有多少有趣呢,俗話說得好俭尖,讀萬卷書不如行萬里路氢惋,我想也是xx女士判別一個人是否有趣的因素吧,而游戲時間上來說稽犁,過短的游戲時間焰望,可能會讓xx女士認(rèn)為男士缺乏幽默,激情已亥,智商的表現(xiàn)熊赖,畢竟游戲很多都是對一個人反應(yīng)能力,情商虑椎,布局能力的各方面體現(xiàn)震鹉,所以,xx女士認(rèn)為一個不玩游戲捆姜,并且飛行距離超長的男士传趾,只能判斷為長期出差在外,所以并不喜歡這類娇未,而她對那些‘死宅’卻保持著一般的興趣墨缘,這點說明,死宅也有春天啊零抬,哈哈哈镊讼。
改進代碼
畫散點陣scatter來說,它的參數(shù)設(shè)置是這樣的:
#plt.scatter(x[i],y[i],marker = 樣式,s=大小半徑,color =顏色,label = 點備注
而書中的有一行代碼是這樣的平夜,我相信也有小伙伴們覺得這個很奇怪:
ax1.scatter(datingDataMat[:,1],datingDataMat[:,2],15*array(datingLabels),15*array(datingLabels)) #scatter散點圖展示第二列和第三列數(shù)據(jù)
第一個好理解蝶棋,15*array(datingLabels)
它來規(guī)定點的尺度大小,而第二個的15*array(datingLabels)
來表示顏色忽妒?很抱歉玩裙,我查找scatter顏色參數(shù)的過程中兼贸,沒有看到這個表示方法的,可能我沒找到吧吃溅,如果有人知道請告訴我一聲為什么可以這么表示顏色溶诞。我目前知道的表示顏色的參數(shù)可以有類似“r”,或者三原色的數(shù)值表示的决侈,并沒有看到單數(shù)值表示的螺垢。所以我改進了一下,寫了個ColorOfDatingLable
函數(shù)赖歌,里面是將數(shù)值轉(zhuǎn)換為顏色值對應(yīng)起來枉圃。所用的語句是這個
ax2.scatter(datingDataMat[:,1],datingDataMat[:,2],s=15*array(datingLabels),color=ColorOfDatingLable(datingLabels)) #scatter散點圖展示第二列和第三列數(shù)據(jù),第一個15*array(datingLabels)用來表現(xiàn)不同標(biāo)簽的不同半徑
他們兩的對比圖我也放在一塊比較了,如圖顯示
相比較而言庐冯,修改后的圖更加清晰孽亲,特色明顯。
你可能還需要知道
- 一些numpy的常用方式展父,請見numpy快速入門
- matplotlib的常用例子返劲,致謝@星星點燈--Python圖表繪制:matplotlib繪圖庫入門
- 它來自于機器學(xué)習(xí)之K-近鄰算法(Python描述)基礎(chǔ)并且只是其中處理數(shù)據(jù)的一部分
- matplotlib官方文檔
致謝
numpy快速入門
@星星點燈--Python圖表繪制:matplotlib繪圖庫入門
@MrLevo520--機器學(xué)習(xí)之K-近鄰算法(Python描述)基礎(chǔ)
matplotlib官方文檔
@MrLevo520--(大)數(shù)據(jù)處理:從txt到MySql的數(shù)據(jù)預(yù)處理遷徙