日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘

發布時間:2023/12/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
挖掘的總體思路:


首先癌癥有不同的發展期

不同發展期的癌癥有不同的癥型

這些癥型都處于不同的嚴重程度。

因此收集病人樣本930條,最終挖掘目標是:

找出這些嚴重程度不同的癥型和癌癥發展階段(我們知道癌癥有初期,中期,晚期等)之間的關系(也就是找到癥狀與疾病之間的關聯規則)


數據來自書籍《Python數據分析與挖掘實戰》的第8章

書籍《Python數據分析與挖掘實戰》中使用了Apriori算法來得到結果,
敝文嘗試使用另外一種關聯規則挖掘算法:FP-Growth 來獲得最終的挖掘結果。


敝文的前半部分代碼來自《Python數據分析與挖掘實戰》,

后半部分代碼通過把挖掘算法Apriori修改為FP-Growth而得,

最終實驗結果表明:FP-Growth可以獲得與Apriori一樣的挖掘效果,并且提升了挖掘速度。

挖掘總流程:

一(對應代碼1)、

每人的6種癥型(癥狀名字的代號是A~F,分別對應下面data.xls中的各種癥型)都處于不同的嚴重程度,

每種癥型按照嚴重程度高低用具體數字賦值,然后根據癥型的嚴重程度不度,聚類為四個區間,并根據某病人的某種癥狀的嚴重程度對應的數值,歸類到四個區間中的某一個區間(下面表格中的區間由后面代碼中的Kmeans聚類后得到)。各個癥型區間表格如下:




表格用法舉例:

例如一個人的肝氣郁結癥型比較嚴重,我們可以給他A3或者A4,如果比較輕,我們給他A1或者A2

同樣的,癥型之間我們認為地位是等同的,一個癥型就是一個6維矢量中的其中一維,6個癥型構成了一個6維矢量,其實也就是數據挖掘算法眼中的集合。

由于每個病人都有六種癥狀的不同區間(例如A1,A2,A3,A4),因此每個病人都可以由一個6維矢量(矢量中的每一維代表一種癥型)來表示,例如(A1,B3,C2,D2,E2,F4)

這些表格中的各個區間的邊界數值都是怎么來的呢?由代碼1運行時,通過Kmeans聚類而得

代碼1:

# -*- coding: utf-8 -*- ''' 聚類離散化,最后的result的格式為:1 2 3 4 A 0 0.178698 0.257724 0.351843 An 240 356.000000 281.000000 53.000000 即(0, 0.178698]有240個,(0.178698, 0.257724]有356個,依此類推。 ''' from __future__ import print_function import pandas as pd from sklearn.cluster import KMeans # 導入K均值聚類算法datafile = '../data/data.xls' #待聚類的數據文件 processedfile = '../tmp/data_processed.xls' # 數據處理后文件 typelabel = {u'肝氣郁結證型系數': 'A', u'熱毒蘊結證型系數': 'B', u'沖任失調證型系數': 'C', u'氣血兩虛證型系數': 'D', u'脾胃虛弱證型系數': 'E', u'肝腎陰虛證型系數': 'F'} k = 4 # 需要進行的聚類類別數# 讀取數據并進行聚類分析 data = pd.read_excel(datafile) # 讀取數據 keys = list(typelabel.keys()) result = pd.DataFrame()if __name__ == '__main__': # 判斷是否主窗口運行,如果是將代碼保存為.py后運行,則需要這句,如果直接復制到命令窗口運行,則不需要這句。for i in range(len(keys)):#每輪循環處理一個癥狀的聚類和數量統計print("i=", i)# 調用k-means算法,進行聚類離散化print(u'正在進行“%s”的聚類...' % keys[i])kmodel = KMeans(n_clusters=k, n_jobs=4) # n_jobs是并行數,一般等于CPU數較好kmodel.fit(data[[keys[i]]].as_matrix()) # 訓練模型r1 = pd.DataFrame(kmodel.cluster_centers_, columns=[typelabel[keys[i]]]) # 聚類中心print("r1=",r1)print("label=", typelabel[keys[i]])###r2 = pd.Series(kmodel.labels_).value_counts() # 分類統計print("r2=",r2)print("-------------------------------------")r2 = pd.DataFrame(r2, columns=[typelabel[keys[i]] + 'number']) # 轉為DataFrame,記錄各個類別的數目print("r2=", r2)#這一段用來統計聚類中各個類別的數量,并且寫入一列中,并改改名字####r=pd.concat([r1, r2], axis=1)print("排序前r=",r)r=r.sort_values(typelabel[keys[i]])print("排序后r=",r)r.index = [1, 2, 3, 4]#index指的是列標簽,typelabel[keys[i]]指的是行標簽####print("----------------------------------------------------")print("計算均值前的表格r=",r)r[typelabel[keys[i]]] = pd.rolling_mean(r[typelabel[keys[i]]], 2) # rolling_mean()用來計算相鄰2列的均值,以此作為邊界點。r[typelabel[keys[i]]][1] = 0.0 # 這兩句代碼將原來的聚類中心改為邊界點.這里的用法類似于C語言中的r[i][j]print("計算均值后的表格r=",r)result = result.append(r.T)#旋轉print("----------------------------------------------------")####print("result=",result)result = result.sort_index() # 以Index排序,即以A,B,C,D,E,F順序排,A代表癥狀的名稱,BCDE各自代表該癥狀的嚴重程度result.to_excel(processedfile)







運行代碼1后得到聚類處理后的文件為data_processed.xls(各種癥型的數據統計),得到上面的表格9~14,同時也得到統計結果:

輸出的結果是:

?1234
A00.1786975890.25772406430.3518431814
Anumber24035628153
B00.15076622770.29663131310.4897045019
Bnumber32539618029
C00.20214872930.28906113770.4235365546
Cnumber29739420435
D00.17650463630.25711995250.3661899988
Dnumber30937121139
E00.15269780220.25754132230.3748694473
Enumber27331924296
F00.17914337550.26138639440.354642668
Fnumber200237265228

結合輸入文件data.xls
由于得到了每種癥狀的各種嚴重程度的量化區間, 以把data.xls中的各個參數(例如A癥狀)轉化為A1~A4
轉化辦法如下:
data.xls中,對每行的首單元進行按行排序,由于data.xls中第一列的各項數據處于data_processed.xls的四個區間中,
分別改為A1~A4,從而得到下一份代碼需要的文件data.txt文件( 可從百度網盤下載: https://pan.baidu.com/s/1miZgHMo ),

舉個例子說明data.txt中的的每行數據是什么意思:

例如,data.xls第一行的數據是:

0.175,0.682,0.171,0.535,0.419,0.447

由于Kmeans得到了“癥型對應的數值的聚類中心”,得到的結果其實就是上文中的表8-9,8-10,8-11,8-12,8-13,8-14,

根據癥型的數值查表,得到由于0.175在區間(0,0.179]中,靠近聚類中心0.179,所以0.175替換為A2,同樣地:

0.682查表8-10,歸類為B1

0.171查表8-11,歸類為C3

0.535查表8-12,歸類為D3

0.419查表8-13,歸類為E1

0.447查表8-14,歸類為F1

以此類推,把6維向量(0.175,0.682,0.171,0.535,0.419,0.447)轉化成(A2,B1,C3,D3,E1,F1,H1)

用代碼批量轉化即可,轉化結果為data.txt,可從百度網盤下載:

https://pan.baidu.com/s/1miZgHMo



二(對應代碼2)、這里使用FP-Growth算法來進行挖掘,找出不同嚴重程度的癥狀和mammary cancer

發展時期之間的聯系,也就是說,找出哪些癥狀(例如A3和B5)極有可能導致乳腺癌之間的某個特定的發展階段(例如H5),例如,腎臟發炎和肝硬化有較大概率導致乳腺癌(這里只是舉個例子,不一定符合真實情況)挖掘結束。




代碼2:

#-*- encoding:utf-8 -*- import sys reload(sys) import pyfpgrowth sys.setdefaultencoding('utf-8')path='./data.txt' def read_data(path):data_lists=[]f = open(path) # 返回一個文件對象 line = f.readline() # 調用文件的 readline()方法for line in open(path):# print type(line) print line # 后面跟 ',' 將忽略換行符 # print(line, end = '')   # 在 Python 3中使用 lists_cell=line.replace('\n','').split(",")#去掉回車鍵,以逗號作為分隔符 data_lists.append(lists_cell)line = f.readline() f.close()return data_liststransactions=read_data(path) # print "transactions=",transactions print len(transactions) print type(transactions)patterns = pyfpgrowth.find_frequent_patterns(transactions, 56)#2 這個位置的參數代表支持度,也就是說出現數量56次以上 rules = pyfpgrowth.generate_association_rules(patterns, 0.87)#0.7 這個位置的參數代表置信度print "FPGrowth關聯規則挖掘結果:" for k,v in rules.items(): print kprint vprint"-"*20
代碼運行結果:

FPGrowth關聯規則挖掘結果:
('A3', 'F4')
(('H4',), 0.8795180722891566)
--------------------
('C3', 'F4')
(('H4',), 0.875)
--------------------
[Finished in 0.1s]

與書上P192結果進行比較,可以發現,雖然書上用的是Apriori,此處使用的是FPGrowth,挖掘得到的關聯規則是一致的:


最后解釋下實驗結果:

順便解釋下基本概念:
下面的support指的是,‘并’的關系

Support(A=>B)=P(AUB)

置信度指的是:條件概率

Confidence(A=>B)=P(B|A)

那么FpGrowth的挖掘結果可以解釋為:

當肝氣郁結癥型系數位于A3區間,并且 肝腎陰虛癥型系數位于F4區間,在這兩個前提的條件下,處于mammary cancer H4階段的概率為0.8795180722891566

在總樣本中,這種情況發生的概率是0.078495,代碼中有個數字是56,設置辦法是:930*0.078495=56



總結

以上是生活随笔為你收集整理的基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。