Passo à passo, implementação do k-médias.
Função objetivo para k-means.
c ci
E= ∑ ∑ || xi - vj ||²
i=1 j=1
onde:
'|| xi – vj ||' é a distância euclidiana entre xi e vj.
th
' ci ' é o número de pontos de dados em i cluster.
' c ' é o número de centros de cluster.
Passos algorítmos para k-médias de agrupamento.
Deixe X = {x1,x2,x3,...,xn} o conjunto de pontos de dados e V={v1,v2,v3,…,Vc} o conjunto de
centróides.
A seguir é mostrado o código do k-means em c++ .
class Centroide{
public:
float x1=rand() % 40+50,y1= rand() % 30+30;
float xc=x1,yc=y1;
int tam1=0,tam2=0;
vector<pair<float,float>> coordenadas;
vector<pair<int,float>> DistanciaPonto;
Centroide(){
}
};
class Kmedias{
int p,centro;
Centroide c[5];
public:
Kmedias(int p,int centro){
this->p=p;
this->centro=centro;
}
void addPonto(float x1,float y1,int chave_){
int k=0;
float minimo=9999.0;
pair<float,float> p;
pair<int,float> p1;
for(int i=0;i<centro;i++){
if(calculaDistancia(x1,y1,c[i].xc,c[i].yc)<minimo){
minimo=calculaDistancia(x1,y1,c[i].xc,c[i].yc);
k=i;
}
}
p.first=x1;
p.second=y1;
c[k].coordenadas.push_back(p);
p1.first=chave_;
p1.second=calculaDistancia(x1,y1,c[k].xc,c[k].yc);
c[k].DistanciaPonto.push_back(p1);
}
float calculaDistancia(float x1,float y1,float xc,float yc){
return sqrt(pow((x1-xc),2)+pow((y1-yc),2));
}
void imprimir(){
int v=0;
for(int k=0;k<centro;k++){
cout<<endl<<"CENTRÓIDE "<<++v<<endl;
for(int i=0;i<c[k].DistanciaPonto.size();i++){
cout<<"Ponto["<<c[k].DistanciaPonto[i].first<<"] Distancia: "<<
fixed<<setprecision(2)<<c[k].DistanciaPonto[i].second<<" Posicao"<<
"("<<c[k].coordenadas[i].first<<","<<c[k].coordenadas[i].second<<")"<<endl;
}
}
}
void NewPosition(){
vector<pair<float,float>> vetorAux;
vector<int> Chave;
pair<float,float> p;
float Vx,Vy;
for(int k=0;k<centro;k++){
Vx=0,Vy=0;
for(int i=0;i<c[k].DistanciaPonto.size();i++){
Vx+=c[k].coordenadas[i].first;
Vy+=c[k].coordenadas[i].second;
p.first=c[k].coordenadas[i].first;
p.second=c[k].coordenadas[i].second;
vetorAux.push_back(p);
}
if(c[k].DistanciaPonto.size()!=0){
c[k].xc=Vx/c[k].DistanciaPonto.size();
c[k].yc=Vy/c[k].DistanciaPonto.size();
}
c[k].coordenadas.clear();
for(int i =0;i<c[k].DistanciaPonto.size();i++){
Chave.push_back(c[k].DistanciaPonto[i].first);
}
c[k].DistanciaPonto.clear();
for(int i=0;i<vetorAux.size();i++){
addPonto(vetorAux[i].first,vetorAux[i].second,Chave[i]);
}
vetorAux.clear();
Chave.clear();
}
}
void imprimirPosicaoCentroide(){
int k=1;
for(int i=0;i<centro;i++){
cout<<"POSICAO DO CENTROIDE "<<k<<": "<<c[i].xc<<" "<<c[i].yc<<endl;
k++;
}
}
};

Kmeans

  • 1.
    Passo à passo,implementação do k-médias. Função objetivo para k-means. c ci E= ∑ ∑ || xi - vj ||² i=1 j=1 onde: '|| xi – vj ||' é a distância euclidiana entre xi e vj. th ' ci ' é o número de pontos de dados em i cluster. ' c ' é o número de centros de cluster. Passos algorítmos para k-médias de agrupamento. Deixe X = {x1,x2,x3,...,xn} o conjunto de pontos de dados e V={v1,v2,v3,…,Vc} o conjunto de centróides. A seguir é mostrado o código do k-means em c++ . class Centroide{ public: float x1=rand() % 40+50,y1= rand() % 30+30; float xc=x1,yc=y1; int tam1=0,tam2=0; vector<pair<float,float>> coordenadas; vector<pair<int,float>> DistanciaPonto; Centroide(){ } }; class Kmedias{ int p,centro; Centroide c[5]; public: Kmedias(int p,int centro){ this->p=p; this->centro=centro; } void addPonto(float x1,float y1,int chave_){ int k=0; float minimo=9999.0; pair<float,float> p; pair<int,float> p1; for(int i=0;i<centro;i++){ if(calculaDistancia(x1,y1,c[i].xc,c[i].yc)<minimo){ minimo=calculaDistancia(x1,y1,c[i].xc,c[i].yc); k=i; } } p.first=x1; p.second=y1; c[k].coordenadas.push_back(p); p1.first=chave_; p1.second=calculaDistancia(x1,y1,c[k].xc,c[k].yc);
  • 2.
    c[k].DistanciaPonto.push_back(p1); } float calculaDistancia(float x1,floaty1,float xc,float yc){ return sqrt(pow((x1-xc),2)+pow((y1-yc),2)); } void imprimir(){ int v=0; for(int k=0;k<centro;k++){ cout<<endl<<"CENTRÓIDE "<<++v<<endl; for(int i=0;i<c[k].DistanciaPonto.size();i++){ cout<<"Ponto["<<c[k].DistanciaPonto[i].first<<"] Distancia: "<< fixed<<setprecision(2)<<c[k].DistanciaPonto[i].second<<" Posicao"<< "("<<c[k].coordenadas[i].first<<","<<c[k].coordenadas[i].second<<")"<<endl; } } } void NewPosition(){ vector<pair<float,float>> vetorAux; vector<int> Chave; pair<float,float> p; float Vx,Vy; for(int k=0;k<centro;k++){ Vx=0,Vy=0; for(int i=0;i<c[k].DistanciaPonto.size();i++){ Vx+=c[k].coordenadas[i].first; Vy+=c[k].coordenadas[i].second; p.first=c[k].coordenadas[i].first; p.second=c[k].coordenadas[i].second; vetorAux.push_back(p); } if(c[k].DistanciaPonto.size()!=0){ c[k].xc=Vx/c[k].DistanciaPonto.size(); c[k].yc=Vy/c[k].DistanciaPonto.size(); } c[k].coordenadas.clear(); for(int i =0;i<c[k].DistanciaPonto.size();i++){ Chave.push_back(c[k].DistanciaPonto[i].first); } c[k].DistanciaPonto.clear(); for(int i=0;i<vetorAux.size();i++){ addPonto(vetorAux[i].first,vetorAux[i].second,Chave[i]); } vetorAux.clear(); Chave.clear(); } } void imprimirPosicaoCentroide(){ int k=1; for(int i=0;i<centro;i++){ cout<<"POSICAO DO CENTROIDE "<<k<<": "<<c[i].xc<<" "<<c[i].yc<<endl; k++; }
  • 3.