目录
一、概念
⼀种典型的⽆监督学习算法,主要⽤于将相似的样本⾃动归到⼀个类别中。
二、K-means聚类
1.步骤
1、随机设置K个特征空间内的点作为初始的聚类中⼼
2、对于其他每个点计算到K个中⼼的距离,未知的点选择最近的⼀个聚类中⼼点作为标记类别
3、接着对着标记的聚类中⼼之后,重新计算出每个聚类的新中⼼点(平均值)
4、如果计算得出的新中⼼点与原中⼼点⼀样(质⼼不再移动),那么结束,否则重新进⾏第⼆步过程
2.流程图
3.代码实现
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import calinski_harabasz_score
from sklearn.datasets._samples_generator import make_blobs
# 创建数据集
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,
# 簇中⼼在[-1,-1], [0,0],[1,1], [2,2], 簇⽅差分别为[0.4, 0.2, 0.2, 0.2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],
random_state=9)
# 数据集可视化
plt.scatter(X[:, 0], X[:, 1], marker='o')
# print(X)
# print(X[:, 0])
plt.show()
#kmeans训练
y_pre=KMeans(n_clusters=2,random_state=9).fit_predict(X)
plt.scatter(X[:,0],X[:,1],c=y_pre)
plt.show()
#用ch_scole查看效果
print(calinski_harabasz_score(X,y_pre)) #越大越好
#kmeans训练
y_pre=KMeans(n_clusters=4,random_state=9).fit_predict(X)
print(y_pre)
plt.scatter(X[:,0],X[:,1],c=y_pre)
plt.show()
#用ch_scole查看效果
print(calinski_harabasz_score(X,y_pre)) #越大越好
左一图:原始数据分布图;中间图:二分类图,右一图:四分类图
三、探究⽤户对物品类别的喜好细分
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
order_product = pd.read_csv("F:\\数学建模\\机器学习\\数据\\order_products__prior.csv")
products = pd.read_csv("F:\\数学建模\\机器学习\\数据\\products.csv")
orders = pd.read_csv("F:\\数学建模\\机器学习\\数据\\orders.csv")
aisles = pd.read_csv("F:\\数学建模\\机器学习\\数据\\aisles.csv")
# print(order_product)
# print(products)
# 合并表格
table1 = pd.merge(order_product, products, on=["product_id", "product_id"])
table2 = pd.merge(table1, orders, on=["order_id", "order_id"])
table = pd.merge(table2, aisles, on=["aisle_id", "aisle_id"])
# print(table1)
data=pd.crosstab(table["user_id"],table["aisle"])
# print(data)
# print(data.shape)
new_data=data[:10000] #前一万行
transfer=PCA(n_components=0.9)
trans_data=transfer.fit_transform(new_data)
print(trans_data)
print(trans_data.shape)
estimator = KMeans(n_clusters=5)
y_pre=estimator.fit_predict(trans_data)
print(y_pre)
#模型评估
print(silhouette_score(trans_data,y_pre))