h5制作多少錢seo教程最新
?計(jì)算數(shù)據(jù)集中的元素與各個(gè)簇的中心的距離,將它賦給最近的簇,然后重新計(jì)算每個(gè)簇的平均值,再將元素按離平均值點(diǎn)最近的原則重新分配直到?jīng)]有出現(xiàn)重新分配
該算法要事先給出k的值,即劃分為幾個(gè)簇。
vector<int> datoclu(data.size(), -1);用這個(gè)來(lái)標(biāo)記每個(gè)數(shù)據(jù)在哪個(gè)簇中。
#include <fstream>
#include <sstream>
#include <vector>
#include <iostream>using namespace std;struct Point
{double x;double y;
};double distance(const Point& a, const Point& b)
{return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}vector<int> KMeans(vector<Point>& data, int k, int maxIterations)
{vector<Point> centroids(k);for (int i = 0; i < k; i++) {centroids[i] = data[rand() % data.size()]; //隨機(jī)選擇k個(gè)類聚中心。0到(data.size()-1)}vector<int> datoclu(data.size(), -1); //每個(gè)數(shù)據(jù)屬于哪個(gè)簇bool flag = 0;while (!flag && maxIterations){flag = 1;for (int i = 0; i < data.size(); i++){double minDis = numeric_limits<double>::max();int index = -1;for (int j = 0; j < centroids.size(); j++){double dis = distance(data[i], centroids[j]);if (dis < minDis){minDis = dis;index = j;}}if (datoclu[i] != index) //記錄每個(gè)數(shù)據(jù)屬于的聚類中心{datoclu[i] = index;flag = 0;}}vector<Point> newClu(k);vector<int> num(k, 0);//計(jì)算每個(gè)簇平均值點(diǎn)for (int i = 0; i < data.size(); i++){newClu[datoclu[i]].x += data[i].x;newClu[datoclu[i]].y += data[i].y;num[datoclu[i]]++;}for (int i = 0; i < k; i++){newClu[i].x /= num[i];newClu[i].y /= num[i];}centroids = newClu;maxIterations--;}return datoclu;
}
vector<Point> ReadData(string filename)
{vector<Point> data;ifstream file(filename);if (file.is_open()){string line;while (getline(file, line)){istringstream iss(line);double x, y;string token;Point point;if (getline(iss, token, ',') && istringstream(token) >> point.x &&getline(iss, token, ',') && istringstream(token) >> point.y) {data.push_back(point);}}}else{cout << "open fail";}file.close();return data;
}int main()
{vector<Point> dataset = ReadData("data.txt");vector<int> clusters;int k, maxIterations;cout << "輸入簇的個(gè)數(shù)和最大迭代次數(shù)"<<endl;cin >> k >> maxIterations;clusters= KMeans(dataset, k, maxIterations);vector <vector<int>> index(k);for (int j = 0; j < k; j++){for (int i = 0; i < clusters.size(); i++){if (clusters[i] == j){index[j].push_back(i);}}}for (int i = 0; i < index.size(); i++){cout << "{";for (int j = 0; j < index[i].size(); j++){cout << index[i][j]+1;if (j != index[i].size() - 1){cout << ",";}}cout << "}";}
}
數(shù)據(jù)集
1.0, 1.0?
2.0, 1.0?
1.0, 2.0 ?
2.0, 2.0 ?
4.0, 3.0 ?
5.0, 3.0 ?
4.0, 4.0 ?
5.0,4.0
運(yùn)行結(jié)果?