说到聚类,应先理解聚类和分类的区别
聚类和分类最大的不同在于:分类的目标是事先已知的,而聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来。
K-Means
聚类算法有很多种(几十种),K-Means是聚类算法中的最常用的一种,算法最大的特点是简单,好理解,运算速度快,但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类。
![9b7c1113c876104a55114fecb5e4fcf1.png](https://i-blog.csdnimg.cn/blog_migrate/0aac129e58024dea4b579357d8450aaf.jpeg)
K-means可以自己写也可以调用库来实现
调用库的实现方式为:
# 使用sklearn实现
from sklearn.cluster import KMeans #导入kmeans库
model = KMeans(n_clusters=16, n_init=100, n_jobs=-1)
model.fit(data) #用数据拟合分类器模型
centroids = model.cluster_centers_
C = model.predict(data) #输出输入数据的预测结果
自己构建的方式为:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
def find_closest_centroids(X, centroids):
m = X.shape[0]
k = centroids.shape[0]
idx = np.zeros(m) # idx[i]为距离样本i最近的集聚中心的索引
for i in range(m):
min_dist = 1000000 #每计算完一个样本点后需要将最短距重新初始化
for j in range(k):
dist = np.sum((X[i,:] - centroids[j,:]) ** 2) #代价函数
if dist < min_dist:
min_dist = dist
idx[i] = j
return idx
def compute_centroids(X, idx, k): #k为聚类中心个数
m,n = X.shape
centroids = np.zeros((k, n)) #聚类中心为(k,n)
for i in range(k):
indices = np.where(idx == i) #为i簇的各样本点的索引
centroids[i,:] = (np.sum(X[indices,:], axis=1) / len(indices[0])).ravel() #len(indices[0])为样本点的数量,axis=1为按列相加
return centroid
def init_centroids(X, k):
m, n = X.shape
centroids = np.zeros((k, n))
idx = np.random.randint(0, m, k)
for i in range(k):
centroids[i,:] = X[idx[i],:] #随机选择训练示例作为聚类中心
return centroids
def run_k_means(X, initial_centroids, max_iters):
m, n = X.shape
k = initial_centroids.shape[0]
idx = np.zeros(m)
centroids = initial_centroids
for i in range(max_iters):
idx = find_closest_centroids(X, centroids)
centroids = compute_centroids(X, idx, k)
return idx, centroids
主要分为以下几个模块:
![b8d16d5eed18d4820c023669e02e2ffd.png](https://i-blog.csdnimg.cn/blog_migrate/f61ed033a89fa8e0342ce9dbd39be059.jpeg)
![88fc9eb2126004fb5b52145109294649.png](https://i-blog.csdnimg.cn/blog_migrate/c74afd53646d344ad69f92347684d286.jpeg)
![afd60e1fadaa26996e46a6648999e9b8.png](https://i-blog.csdnimg.cn/blog_migrate/47d8da33e073c84e525a17c5382e1b79.jpeg)
![bcf1bc39ea72429ea632446e2620ad17.png](https://i-blog.csdnimg.cn/blog_migrate/6d1fb22506099fded662a3d073c16e21.jpeg)
需要加的模块就是,前面加上读取excel的模块,后面加上画图可视化的模块
2021.01.08