如何将UCI数据集转换成Matlab可用格式
在開始學習機器學習和數據挖掘的過程中,我的導師讓我看了一篇關于聚類的論文 A testing based extraction algorithm for identifying significant communities in networks.pdf,該論文提出了一個基于假設檢驗的算法ESSC。導師說等我看明白之后就可以編程實現,我看了不到兩周,然后試著用 Matlab 實現這個算法。
在實現過程中,我不單單是直接對著論文中的偽代碼敲代碼,還找了一個數據集作為假想敵。一邊對照著偽代碼,一邊思考著如何才能保證代碼在該數據集上跑起來不會有問題,這使我在實現該算法的過程中順利了很多。
由于 UCI 網站上的數據集都是文本格式,所以我在得到在 Matlab 中比較方便的 .mat 格式遇到了一些困難。經過一番搜索,我把我尋找和得到數據集,再轉換成可用格式的過程總結成了一篇博客:如何使用UCI數據集 - 菜鳥阿華
在第一個數據集上做了很多次實驗之后,我跟導師反饋說實驗效果一直都不是很好,導師建議我把數據進行一下歸一化處理并且找一些其他的數據集實驗。經過一番尋找,我找到了一個符合要求的數據集 Wine。當我打算用原來的方法得到可用格式數據時出現了一些問題,于是我查詢了所使用函數 textread 的幫助文檔 textread。原方法有一定問題,而且我忽略了Matlab提供的Note:
按照Matlab指示,我查看了 textscan 的幫助文檔 textscan,學習了該函數的使用方法,對著 Matlab 提供的示例,一個一個敲出來觀察實驗結果。經過一番折騰,我終于得到了 Wine 數據集的可用格式,實現代碼如下:
fileID = fopen('wine.data'); % 該數據文件需在當前目錄下 C = textscan(fileID, '%f %f %f %f %f %f %f %f %f %f %f %f %f %f', 'delimiter', ','); % 返回cell格式的數據 %f個數為特征個數 fclose(fileID); source_wine = cell2mat(C); % 將cell格式轉換成mat格式 wine = source_wine(:, 2:14); % 第一列是類標簽,去掉即可 save source_wine.mat source_wine; % 便于將來使用 save wine.mat wine;新方法看起來原方法簡單多了吧!這里仍有值得注意的兩點:1. Matlab中的cell是什么? 2. cell2mat方法如何使用。不過博主對于這兩點還不太清楚,于是趕緊滾去查一些大牛的博客啦~~
順便貼一下我實現的ESSC代碼吧(程序中還有bug但一直找不到,/哭泣):
function [ c_number ] = ESSC(dist_matrix, alpha) % ESSC : ESSC主函數 % 參數dist_matrix:數據集中兩兩之間的距離矩陣 % 參數dataset:整個數據集 類似iris數值型數據 % 參數alpha: 顯著性水平閾值d = [1:size(dist_matrix, 1)]'; % vector 標識數據集中數據的index v = d; % 提取一個社區后剩余的數據 c_number = 1; proportion = 1/2; % 種子大小比例while c_number% 選取種子集合seedsetrandom = round(1 + (size(v, 1)-1)*rand); % 產生1-size(v,1)隨機數,四舍五入seed = v(random); % 種子為剩余數據v中的第random條數據seedset = []; % 種子集合seedset_size = round(size(v, 1) * proportion); % 確定種子集合的大小:每次剩余數據的1/2% 提取剩余數據集v中與seed數據距離最近的(seedset_size)條數據,距離最近的是seed本身if seedset_size ~= 0seed_dist_with_v = [v, dist_matrix(seed, v')'];seed_dist_with_v_sort = sortrows(seed_dist_with_v, 2); % 按第2列距離排序seedset = seed_dist_with_v_sort(1:seedset_size, 1);elseif seedset_size == 0seedset = [seed];end% Community-Searchb0 = seedset; % b0 第一次循環代表種子集合,之后代表上一次發現的社區b1 = []; % 每次社區更新后的結果b_temp = b0; % 臨時社區 第一次為b0while ~(isempty(setdiff(b0, b1)) && isempty(setdiff(b1, b0))) % b0不等于b1b0 = b1; % b0代表上一次發現的社區 第一次為空集group1 = b_temp; % 得到group1group2 = setdiff(d, b_temp); % 得到group2b_temp = []; % 臨時社區置空% 對數據集d中的每一條數據i,計算數據i到兩個group中每條數據的距離vectorgroup1_dist = [];group2_dist = [];pvalue = [[1:150]', ones(150,1)];for i = 1: size(d, 1)% 計算數據i到group1中每條數據的距離vectorgroup1_dist = dist_matrix(i, group1')';% 計算數據i到group2中每條數據的距離vectorgroup2_dist = dist_matrix(i, group2')';% 計算pvalueif(size(group1_dist, 1) ~= 0 && size(group2_dist, 1) ~= 0)pvalue(i, 2) = ranksum(group1_dist, group2_dist, 'tail', 'left');endend% pvalue排序和使用FDR校正pvalue_order = sortrows(pvalue, 2);for i = 1:size(pvalue_order, 1)if pvalue_order(i, 2) <= i*alpha/size(pvalue_order, 1)b_temp = [b_temp; pvalue_order(i, 1)];elseif pvalue_order(i, 2) > i*alpha/size(pvalue_order, 1)break;endendb1 = b_temp;end% 收集社區c0 = b0; % Community_search返回的社區b0c = strcat('c', int2str(c_number)); %字符串c 代表第c_number個社區的名字eval([c, '=c0;']); % 把c0的值賦值給名字為字符串c的變量中if ~isempty(c0)save(strcat('community_', strcat(int2str(c_number), '.mat')), c);c_number = c_number + 1;v = setdiff(v, c0);if size(v, 1) == 0break;endelseif isempty(c0)break;endendc_number = c_number -1; % 社區個數 save('background.mat', 'v');end總結
以上是生活随笔為你收集整理的如何将UCI数据集转换成Matlab可用格式的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C++, ID、指针、handle (v
- 下一篇: 静态成员变量和非静态成员变量的对比
