python熱力圖實現(xiàn)的完整實例
一、數(shù)據(jù)無量綱化處理 (熱力圖)
1.數(shù)據(jù)無量綱化處理(僅介紹本文用到的方法):min-max歸一化
該方法是對原始數(shù)據(jù)進(jìn)行線性變換,將其映射到[0,1]之間,該方法也被稱為離差標(biāo)準(zhǔn)化。
上式中,min是樣本的最小值,max是樣本的最大值。由于最大值與最小值可能是動態(tài)變化的,同時也非常容易受噪聲(異常點、離群點)影響,因此一般適合小數(shù)據(jù)的場景。此外,該方法還有兩點好處:
1) 如果某屬性/特征的方差很小,如身高:np.array([[1.70],[1.71],[1.72],[1.70],[1.73]]),實際5條數(shù)據(jù)在身高這個特征上是有差異的,但是卻很微弱,這樣不利于模型的學(xué)習(xí),進(jìn)行min-max歸一化后為:array([[ 0. ], [ 0.33333333], [ 0.66666667], [ 0. ], [ 1. ]]),相當(dāng)于放大了差異;
2) 維持稀疏矩陣中為0的條目。
2.代碼展示
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn.datasets import load_wine wine = load_wine() data = wine.data # 數(shù)據(jù) lables = wine.target # 標(biāo)簽 feaures = wine.feature_names df = pd.DataFrame(data, columns=feaures) # 原始數(shù)據(jù) # 第一步:無量綱化 def standareData(df): """ df : 原始數(shù)據(jù) return : data 標(biāo)準(zhǔn)化的數(shù)據(jù) """ data = pd.DataFrame(index=df.index) # 列名,一個新的dataframe columns = df.columns.tolist() # 將列名提取出來 for col in columns: d = df[col] max = d.max() min = d.min() mean = d.mean() data[col] = ((d - mean) / (max - min)).tolist() return data # 某一列當(dāng)做參照序列,其他為對比序列 def graOne(Data, m=0): """ return: """ columns = Data.columns.tolist() # 將列名提取出來 # 第一步:無量綱化 data = standareData(Data) referenceSeq = data.iloc[:, m] # 參考序列 data.drop(columns[m], axis=1, inplace=True) # 刪除參考列 compareSeq = data.iloc[:, 0:] # 對比序列 row, col = compareSeq.shape # 第二步:參考序列 - 對比序列 data_sub = np.zeros([row, col]) for i in range(col): for j in range(row): data_sub[j, i] = abs(referenceSeq[j] - compareSeq.iloc[j, i]) # 找出最大值和最小值 maxVal = np.max(data_sub) minVal = np.min(data_sub) cisi = np.zeros([row, col]) for i in range(row): for j in range(col): cisi[i, j] = (minVal + 0.5 * maxVal) / (data_sub[i, j] + 0.5 * maxVal) # 第三步:計算關(guān)聯(lián)度 result = [np.mean(cisi[:, i]) for i in range(col)] result.insert(m, 1) # 參照列為1 return pd.DataFrame(result) def GRA(Data): df = Data.copy() columns = [str(s) for s in df.columns if s not in [None]] # [1 2 ,,,12] # print(columns) df_local = pd.DataFrame(columns=columns) df.columns = columns for i in range(len(df.columns)): # 每一列都做參照序列,求關(guān)聯(lián)系數(shù) df_local.iloc[:, i] = graOne(df, m=i)[0] df_local.index = columns return df_local # 熱力圖展示 def ShowGRAHeatMap(DataFrame): colormap = plt.cm.hsv ylabels = DataFrame.columns.values.tolist() f, ax = plt.subplots(figsize=(15, 15)) ax.set_title('Wine GRA') # 設(shè)置展示一半,如果不需要注釋掉mask即可 mask = np.zeros_like(DataFrame) mask[np.triu_indices_from(mask)] = True # np.triu_indices 上三角矩陣 with sns.axes_style("white"): sns.heatmap(DataFrame, cmap="YlGnBu", annot=True, mask=mask, ) plt.show() data_wine_gra = GRA(df) ShowGRAHeatMap(data_wine_gra)
3.效果展示
二、皮爾斯系數(shù)相關(guān)(熱力圖)
1.數(shù)學(xué)知識
利用熱力圖可以看數(shù)據(jù)表里多個特征兩兩的相似度。
相似度由皮爾遜相關(guān)系數(shù)度量。
兩個變量之間的皮爾遜相關(guān)系數(shù)定義為兩個變量之間的協(xié)方差和標(biāo)準(zhǔn)差的商:
2.代碼展示
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns # ====熱力圖 from matplotlib.ticker import FormatStrFormatter encoding="utf-8" data = pd.read_csv("tu.csv", encoding="utf-8") #讀取數(shù)據(jù) data.drop_duplicates() data.columns = [i for i in range(data.shape[1])] # 計算兩兩屬性之間的皮爾森相關(guān)系數(shù) corrmat = data.corr() f, ax = plt.subplots(figsize=(12, 9)) # 返回按“列”降序排列的前n行 k = 30 cols = corrmat.nlargest(k, data.columns[0]).index # 返回皮爾遜積矩相關(guān)系數(shù) cm = np.corrcoef(data[cols].values.T) sns.set(font_scale=1.25) hm = sns.heatmap(cm, cbar=True, annot=True, square=True, fmt=".3f", vmin=0, #刻度閾值 vmax=1, linewidths=.5, cmap="RdPu", #刻度顏色 annot_kws={"size": 10}, xticklabels=True, yticklabels=True) #seaborn.heatmap相關(guān)屬性 # 解決中文顯示問題 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False # plt.ylabel(fontsize=15,) # plt.xlabel(fontsize=15) plt.title("主要變量之間的相關(guān)性強弱", fontsize=20) plt.show()
3.seaborn.heatmap屬性介紹
1)Seaborn是基于matplotlib的Python可視化庫
seaborn.heatmap()熱力圖,用于展示一組變量的相關(guān)系數(shù)矩陣,列聯(lián)表的數(shù)據(jù)分布,通過熱力圖我們可以直觀地看到所給數(shù)值大小的差異狀況。
seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels='auto', yticklabels='auto', mask=None, ax=None, **kwargs)
2)參數(shù)輸出(均為默認(rèn)值)
sns.heatmap( data, vmin=None, vmax=None, cmap=None, center=None, robust=False, annot=None, fmt='.2g', annot_kws=None, linewidths=0, linecolor=‘white', cbar=True, cbar_kws=None, cbar_ax=None, square=False, xticklabels=‘a(chǎn)uto', yticklabels=‘a(chǎn)uto', mask=None, ax=None, )
3)具體介紹
(1)熱力圖輸入數(shù)據(jù)參數(shù)data:矩陣數(shù)據(jù)集,可以是numpy的數(shù)組(array),也可以是pandas的DataFrame。如果是DataFrame,則df的index/column信息會分別對應(yīng)到heatmap的columns和rows,即df.index是熱力圖的行標(biāo),df.columns是熱力圖的列標(biāo)
(2)熱力圖矩陣塊顏色參數(shù)vmax,vmin:分別是熱力圖的顏色取值最大和最小范圍,默認(rèn)是根據(jù)data數(shù)據(jù)表里的取值確定
(3)熱力圖矩陣塊注釋參數(shù)
cmap:從數(shù)字到色彩空間的映射,取值是matplotlib包里的colormap名稱或顏色對象,或者表示顏色的列表;改參數(shù)默認(rèn)值:根據(jù)center參數(shù)設(shè)定
center:數(shù)據(jù)表取值有差異時,設(shè)置熱力圖的色彩中心對齊值;通過設(shè)置center值,可以調(diào)整生成的圖像顏色的整體深淺;設(shè)置center數(shù)據(jù)時,如果有數(shù)據(jù)溢出,則手動設(shè)置的vmax、vmin會自動改變
robust:默認(rèn)取值False;如果是False,且沒設(shè)定vmin和vmax的值,熱力圖的顏色映射范圍根據(jù)具有魯棒性的分位數(shù)設(shè)定,而不是用極值設(shè)定annot(annotate的縮寫):默認(rèn)取值False;如果是True,在熱力圖每個方格寫入數(shù)據(jù);如果是矩陣,在熱力圖每個方格寫入該矩陣對應(yīng)位置數(shù)據(jù)
(4)熱力圖矩陣塊之間間隔及間隔線參數(shù)
fmt:字符串格式代碼,矩陣上標(biāo)識數(shù)字的數(shù)據(jù)格式,比如保留小數(shù)點后幾位數(shù)字
annot_kws:默認(rèn)取值False;如果是True,設(shè)置熱力圖矩陣上數(shù)字的大小顏色字體,matplotlib包text類下的字體設(shè)置;linewidths:定義熱力圖里“表示兩兩特征關(guān)系的矩陣小塊”之間的間隔大小
(5)熱力圖顏色刻度條參數(shù)
linecolor:切分熱力圖上每個矩陣小塊的線的顏色,默認(rèn)值是’white’cbar:是否在熱力圖側(cè)邊繪制顏色刻度條,默認(rèn)值是True
(6)square:設(shè)置熱力圖矩陣小塊形狀,默認(rèn)值是False
cbar_kws:熱力圖側(cè)邊繪制顏色刻度條時,相關(guān)字體設(shè)置,默認(rèn)值是None
cbar_ax:熱力圖側(cè)邊繪制顏色刻度條時,刻度條位置設(shè)置,默認(rèn)值是Nonexticklabels, yticklabels:xticklabels控制每列標(biāo)簽名的輸出;yticklabels控制每行標(biāo)簽名的輸出。默認(rèn)值是auto。如果是True,則以DataFrame的列名作為標(biāo)簽名。如果是False,則不添加行標(biāo)簽名。如果是列表,則標(biāo)簽名改為列表中給的內(nèi)容。如果是整數(shù)K,則在圖上每隔K個標(biāo)簽進(jìn)行一次標(biāo)注。 如果是auto,則自動選擇標(biāo)簽的標(biāo)注間距,將標(biāo)簽名不重疊的部分(或全部)輸出
mask:控制某個矩陣塊是否顯示出來。默認(rèn)值是None。如果是布爾型的DataFrame,則將DataFrame里True的位置用白色覆蓋掉
ax:設(shè)置作圖的坐標(biāo)軸,一般畫多個子圖時需要修改不同的子圖的該值
**kwargs:所有其他關(guān)鍵字參數(shù)都傳遞給 ax.pcolormesh。
4效果展示
總結(jié)
到此這篇關(guān)于python熱力圖實現(xiàn)的文章就介紹到這了,更多相關(guān)python熱力圖實現(xiàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基礎(chǔ)之面對對象基礎(chǔ)類和對象的概念
這篇文章主要介紹了python面對對象基礎(chǔ)類和對象的概念,實例分析了Python中返回一個返回值與多個返回值的方法,需要的朋友可以參考下2021-10-10

Django配置celery(非djcelery)執(zhí)行異步任務(wù)和定時任務(wù)

python?dataframe獲得指定行列實戰(zhàn)代碼