• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 183,  comments - 10,  trackbacks - 0

            K-近鄰法的實(shí)現(xiàn)

            K-近鄰法是根據(jù)距離最近的 k 個(gè)樣例的類(lèi)型來(lái)推測(cè)該樣例的類(lèi)型。
            實(shí)現(xiàn)中中主要的環(huán)節(jié)有:
            ·訓(xùn)練樣例格式和測(cè)試樣例格式的定義
            ·樣例結(jié)構(gòu)體的定義
            ·訓(xùn)練樣例和測(cè)試樣例的讀取
            ·樣例距離的計(jì)算,歐氏距離
            ·距離矩陣的生成
            ·針對(duì)每個(gè)測(cè)試樣例,得到其到每個(gè)訓(xùn)練樣例的距離,根據(jù)距離由小到大排序,更具距離和權(quán)重成反比的關(guān)系,計(jì)算每個(gè)類(lèi)型的總的權(quán)重,得到最大權(quán)重的那個(gè)類(lèi)型,即是當(dāng)前測(cè)試樣例的類(lèi)型
            ·k 值的選擇和設(shè)定

            訓(xùn)練樣本的格式是:
            每行代表一個(gè)樣例,每行的第一個(gè)元素是該樣例的類(lèi)型,后面是該樣例的特征向量
            例如:

            train.txt
            a    1 2 3 4 5
            b    5 4 3 2 1
            c    3 3 3 3 3
            d    -3 -3 -3 -3 -3
            a    1 2 3 4 4
            b    4 4 3 2 1
            c    3 3 3 2 4
            d    0 0 1 1 -2

             


            測(cè)試樣例的格式是:
            每行代表一個(gè)樣例,每行即是該樣例的特征向量
            例如:
            test.txt
            1 2 3 2 4
            2 3 4 2 1
            8 7 2 3 5
            -3 -2 2 4 0
            -4 -4 -4 -4 -4
            1 2 3 4 4
            4 4 3 2 1
            3 3 3 2 4
            0 0 1 1 -2

            測(cè)試樣例的輸出結(jié)果的格式是:
            格式與訓(xùn)練樣例一樣,即每行代表一個(gè)樣例,每行的第一個(gè)元素是學(xué)習(xí)到的測(cè)試樣例的類(lèi)型,后面是該樣例的特征向量
            例如:
            result.txt
            a    1 2 3 2 4 
            b    2 3 4 2 1 
            b    8 7 2 3 5 
            a    -3 -2 2 4 0 
            d    -4 -4 -4 -4 -4 
            a    1 2 3 4 4 
            b    4 4 3 2 1 
            c    3 3 3 2 4 
            d    0 0 1 1 -2 

            具體的程序?qū)崿F(xiàn)如下:

              1 /*
              2     K-近鄰法的實(shí)現(xiàn)
              3     mark
              4     goonyangxiaofang@163.com
              5     QQ 591 247 876
              6     2012.02.13
              7 */
              8 
              9 
             10 #include <iostream>
             11 #include <string>
             12 #include <vector>
             13 #include <set>
             14 #include <map>
             15 #include <fstream>
             16 #include <sstream>
             17 #include <cassert>
             18 #include <cmath>
             19 using namespace std;
             20 
             21 // 樣例結(jié)構(gòu)體,所屬類(lèi)型和特征向量
             22 struct sample
             23 {
             24     string type;
             25     vector<double> features;
             26 };
             27 
             28 // 類(lèi)型和距離結(jié)構(gòu)體,未用到
             29 struct typeDistance
             30 {
             31     string type;
             32     double distance;
             33 };
             34 
             35 bool operator < (const typeDistance& lhs, const typeDistance& rhs)
             36 {
             37     return lhs.distance < rhs.distance;
             38 }
             39 
             40 // 讀取訓(xùn)練樣本
             41 // 訓(xùn)練樣本的格式是:每行代表一個(gè)樣例
             42 // 每行的第一個(gè)元素是類(lèi)型名,后面的是樣例的特征向量
             43 // 例如:
             44 /*
             45 a    1 2 3 4 5
             46 b    5 4 3 2 1
             47 c    3 3 3 3 3
             48 d    -3 -3 -3 -3 -3
             49 a    1 2 3 4 4
             50 b    4 4 3 2 1
             51 c    3 3 3 2 4
             52 d    0 0 1 1 -2
             53 */
             54 void readTrain(vector<sample>& train, const string& file)
             55 {
             56     ifstream fin(file.c_str());
             57     if (!fin)
             58     {
             59         cerr << "File error!" << endl;
             60         exit(1);
             61     }
             62     string line;
             63     double d = 0.0;
             64     while (getline(fin, line))
             65     {
             66         istringstream sin(line);
             67         sample ts;
             68         sin >> ts.type;
             69         while (sin >> d)
             70         {
             71             ts.features.push_back(d);
             72         }
             73         train.push_back(ts);
             74     }
             75     fin.close();
             76 }
             77 
             78 // 讀取測(cè)試樣本
             79 // 每行代表一個(gè)樣例
             80 // 每一行是一個(gè)樣例的特征向量
             81 // 例如:
             82 /*
             83 1 2 3 2 4
             84 2 3 4 2 1
             85 8 7 2 3 5
             86 -3 -2 2 4 0
             87 -4 -4 -4 -4 -4
             88 1 2 3 4 4
             89 4 4 3 2 1
             90 3 3 3 2 4
             91 0 0 1 1 -2
             92 */
             93 void readTest(vector<sample>& test, const string& file)
             94 {
             95     ifstream fin(file.c_str());
             96     if (!fin)
             97     {
             98         cerr << "File error!" << endl;
             99         exit(1);
            100     }
            101     double d = 0.0;
            102     string line;
            103     while (getline(fin, line))
            104     {
            105         istringstream sin(line);
            106         sample ts;
            107         while (sin >> d)
            108         {
            109             ts.features.push_back(d);
            110         }
            111         test.push_back(ts);
            112     }
            113     fin.close();
            114 }
            115 
            116 // 計(jì)算歐氏距離
            117 double euclideanDistance(const vector<double>& v1, const vector<double>& v2)
            118 {
            119     assert(v1.size() == v2.size());
            120     double ret = 0.0;
            121     for (vector<double>::size_type i = 0; i != v1.size(); ++i)
            122     {
            123         ret += (v1[i] - v2[i]) * (v1[i] - v2[i]);
            124     }
            125     return sqrt(ret);
            126 }
            127 
            128 // 初始化距離矩陣
            129 // 該矩陣是根據(jù)訓(xùn)練樣本和測(cè)試樣本而得
            130 // 矩陣的行數(shù)為測(cè)試樣本的數(shù)目,列數(shù)為訓(xùn)練樣本的數(shù)目
            131 void initDistanceMatrix(vector<vector<double> >& dm, const vector<sample>& train, const vector<sample>& test)
            132 {
            133     for (vector<sample>::size_type i = 0; i != test.size(); ++i)
            134     {
            135         vector<double> vd;
            136         for (vector<sample>::size_type j = 0; j != train.size(); ++j)
            137         {
            138             vd.push_back(euclideanDistance(test[i].features, train[j].features));
            139         }
            140         dm.push_back(vd);
            141     }
            142 }
            143 
            144 // K-近鄰法的實(shí)現(xiàn)
            145 // 設(shè)定不同的 k 值,給每個(gè)測(cè)試樣例予以一個(gè)類(lèi)型
            146 // 距離和權(quán)重成反比
            147 void knnProcess(vector<sample>& test, const vector<sample>& train, const vector<vector<double> >& dm, unsigned int k)
            148 {
            149     for (vector<sample>::size_type i = 0; i != test.size(); ++i)
            150     {
            151         multimap<doublestring> dts;
            152         for (vector<double>::size_type j = 0; j != dm[i].size(); ++j)
            153         {
            154             if (dts.size() < k)
            155             {
            156                 dts.insert(make_pair(dm[i][j], train[j].type));
            157             }
            158             else
            159             {
            160                 multimap<doublestring>::iterator it = dts.end();
            161                 --it;
            162                 if (dm[i][j] < it->first)
            163                 {
            164                     dts.erase(it);
            165                     dts.insert(make_pair(dm[i][j], train[j].type));
            166                 }
            167             }
            168         }
            169         map<stringdouble> tds;
            170         string type = "";
            171         double weight = 0.0;
            172         for (multimap<doublestring>::const_iterator cit = dts.begin(); cit != dts.end(); ++cit)
            173         {
            174             // 不考慮權(quán)重的情況,在 k 個(gè)樣例中只要出現(xiàn)就加 1
            175             // ++tds[cit->second];
            176 
            177             // 這里是考慮距離與權(quán)重的關(guān)系,距離越大權(quán)重越小
            178             tds[cit->second] += 1.0 / cit->first;
            179             if (tds[cit->second] > weight)
            180             {
            181                 weight = tds[cit->second];
            182                 type = cit->second;
            183             }
            184         }
            185         test[i].type = type;
            186     }
            187 }
            188 
            189 // 輸出結(jié)果
            190 // 輸出的格式和訓(xùn)練樣本的格式一樣
            191 // 每行表示一個(gè)樣例,第一個(gè)元素是該樣例的類(lèi)型,后面是該樣例的特征向量
            192 // 例如:
            193 /*
            194 a    1 2 3 2 4 
            195 b    2 3 4 2 1 
            196 b    8 7 2 3 5 
            197 a    -3 -2 2 4 0 
            198 d    -4 -4 -4 -4 -4 
            199 a    1 2 3 4 4 
            200 b    4 4 3 2 1 
            201 c    3 3 3 2 4 
            202 d    0 0 1 1 -2 
            203 */
            204 void writeTest(const vector<sample>& test, const string& file)
            205 {
            206     ofstream fout(file.c_str());
            207     if (!fout)
            208     {
            209         cerr << "File error!" << endl;
            210         exit(1);
            211     }
            212     for (vector<sample>::size_type i = 0; i != test.size(); ++i)
            213     {
            214         fout << test[i].type << '\t';
            215         for (vector<double>::size_type j = 0; j != test[i].features.size(); ++j)
            216         {
            217             fout << test[i].features[j] << ' ';
            218         }
            219         fout << endl;
            220     }
            221 }
            222 
            223 // 封裝
            224 void knn(const string& file1, const string& file2, const string& file3, int k)
            225 {
            226     vector<sample> train, test;
            227     readTrain(train, file1.c_str());
            228     readTest(test, file2.c_str());
            229     vector<vector<double> > dm;
            230     initDistanceMatrix(dm, train, test);
            231     knnProcess(test, train, dm, k);
            232     writeTest(test, file3.c_str());
            233 }
            234 
            235 // 測(cè)試
            236 int main()
            237 {
            238     knn("train.txt""test.txt""result.txt"5);
            239     return 0;
            240 }
            241 




            posted on 2012-02-14 09:47 unixfy 閱讀(4916) 評(píng)論(0)  編輯 收藏 引用

            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            欧美一区二区三区久久综| 伊人久久大香线蕉成人| 精品久久人妻av中文字幕| 97精品伊人久久大香线蕉app | 亚洲乱码精品久久久久..| 久久人人爽人人人人片av| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 久久99久久无码毛片一区二区| 久久久久18| 亚洲AV无码成人网站久久精品大| 精品久久一区二区三区| 亚洲伊人久久综合影院| 精品国产乱码久久久久久郑州公司| 久久精品国产福利国产琪琪| 欧美激情一区二区久久久| 久久99精品国产麻豆宅宅| 99久久做夜夜爱天天做精品| 精品久久香蕉国产线看观看亚洲 | 久久久久这里只有精品| 午夜精品久久久久久久久| 久久se精品一区二区影院 | 国产日韩久久免费影院| 性高湖久久久久久久久| 人妻少妇精品久久| 粉嫩小泬无遮挡久久久久久| 久久精品极品盛宴观看| 亚洲国产成人久久综合碰碰动漫3d| 超级97碰碰碰碰久久久久最新| 91精品国产91久久久久久| 亚洲国产精品无码久久久蜜芽 | 中文成人无码精品久久久不卡| …久久精品99久久香蕉国产 | 蜜桃麻豆www久久| 久久久久亚洲精品日久生情| 国产精品99久久久久久宅男| 久久精品国产亚洲AV嫖农村妇女| 久久中文字幕视频、最近更新| 青青草原综合久久大伊人精品| 久久久老熟女一区二区三区| 四虎国产精品成人免费久久| 久久久国产一区二区三区|