> neuron
> synapse:digital circuits和nanotech(memristors憶阻)
> 憶阻:the missing memristor found
> 機器學習:學習一些引數
原空間問題轉化為對偶問題的解,對偶空間的優化問題,(x1,x2)兩個空間的內積。
引入核空間的概念,把x轉入到另外乙個空間。
最簡單的情況:用normalized mutual information
它可以度量同一組資料的兩種給標籤的方法之間的差異
所以你可以選取有標籤的資料來訓練,先去掉標籤混到一起,用不同的演算法聚類,聚類之後再按照聚好的類打上標籤,然後分別計算標準標籤(就是原來的標籤)和聚好類之後的標籤之間的差異大小,跟標準標籤相差最小的標籤就是最好的
問題1:k值選取問題
k的選取通常是我們的目標,也就是說,我們要將這隊資料分為幾類。因此,是相對明確的。
問題2:初始值的選取問題
初始值的選取對於迭代的結果有較大的影響,選取不當,會出現所有點都歸為一類的情況。乙個通常的解決方案是:隨機選取多組初始值進行分類,選取損失函式最小的分類結果。
程式設計舉例:
將如下三維空間的點進行k-means分類:
[input.txt]
1.0 , 5.7 , 2.8
4.5 , 5.2 , -0.3
-0.9 , 8.1 , 1.4
0.5 , 6.6 , 2.3
3.5 , 4.7 , 0.2
4.7 , 5.9 , -1
5.1 , 8.2 , 0.9
2.1 , 7.4 , 3.0
0.6 , 6.5 , 3.8
在三維空間的圖及k-means分類的結果
k-means c++實現
#include
#include
#include
#include
#define dim 3//輸入特徵x的維數
#define k 2//分類的個數
#define max_num 100//讀取輸入資料的最大數目
using
namespace
std;
//定義類,封裝輸入向量x,及它要分到哪個類別
class inputfeature
//輸入函式
void print()
cout
<
/計算該特徵向量與輸入向量的2範數(歐式距離)
double distanceof(double u[dim])
};
vector
inputvector;//儲存輸入特徵向量
void inputdata()//從檔案中讀取資料
char ch;
int i;
for (i=0;i//讀取數目
while (ch!=',')//讀取第乙個資料
continue;
} s_x1+=ch;
if(!ifile.get(ch))
}
if(!ifile.get(ch))
while (ch!=',')//讀取第二個資料
//跳過空格
continue;
}
s_x2+=ch;
if(!ifile.get(ch))
}
if(!ifile.get(ch))
while(ch!='\n')//讀取第三個資料
continue;
}
s_x3+=ch;
if(!ifile.get(ch))
} double xt[dim];//將讀入的字串轉化為小數
xt[0]=atof(s_x1.c_str());
xt[1]=atof(s_x2.c_str());
xt[2]=atof(s_x3.c_str());
inputfeature t1(xt);//生成特徵向量
inputvector.push_back(t1);//儲存到陣列
}
ifile.close();
} //計算在誤差err內,2次迭代的結果是否一樣
bool compareu(double u0[k][dim],double u[k][dim],double err)
} }
return
true;
} //k-means演算法核心
void k_means(double u[k][dim])
double mindist=dist[0];//初始化最小距離
it->cluster=0;//初始化分類
for (j=1;jif (dist[j]//如果發現離第j個更近,則更新分類
} }
//第二步 更新重心u
double sum[k][dim],num[k];
memset(&sum,0,sizeof(double)*k*dim);
memset(&num,0,sizeof(double)*k);
for(it = inputvector.begin(); it != inputvector.end(); ++it)
num[it->cluster]++;//計算相同分類的數目
} for (j=0;j//更新標定向量的重心
} //判斷是否收斂, u==u0時收斂
if (compareu(u0,u,1.0e-5))
memcpy(u0,u,sizeof(double)*k*dim);//將本次迭代的結果儲存
} //輸出聚類的結果
cout
<
<
for (int d=0;dcout
} cout
/此時每個元素的分類情況為:
cout
<
::iterator it;
for(it = inputvector.begin(); it != inputvector.end(); ++it)
//計算誤差函式
double j=0;
for(it = inputvector.begin(); it != inputvector.end(); ++it)
cout
<
,};
k_means(u);//進行k-means聚類
return
0;
}
有監督學習和無監督學習 無監督學習
一.無監督學習包含的演算法 聚類 kmeans聚類演算法 降維 pca 之所以叫無監督學習 是因為模型是從無標籤的資料開始學習,沒有目標值。二.kmeans聚類 1.聚類演算法步驟 定義 將高維資料轉化為低維資料的過程,在此過程中可能會捨棄原有資料,創造新的變數 作用 降低原始資料的維數 複雜度 損...
無監督學習與監督學習
1.無監督和有監督的理解方法有很多,主要可以從以下幾方面來理解 1 無監督與監督學習的區別在於乙個無教學值,乙個有教學值。但是,個人認為他們的區別在於無監督學習一般是採用聚簇等演算法來分類不同樣本。而監督學習一般是利用教學值與實際輸出值產生的誤差,進行誤差反向傳播修改權值來完成網路修正的。但是無監督...
監督學習和無監督學習
機器學習要解決的第一類問題是分類問題。機器學習的另一項任務是回歸,它主要用於 數值型資料。大多數人可能都見過回歸的例子 資料擬合曲線 通過給定資料點的最優擬合曲線。分類和回歸都屬於監督學習,之所以稱之為監督學習,是因為這類演算法必須知道 什麼,即目標變數的分類資訊。與監督學習對應的是無監督學習,此時...