《人工智能与机器学习》
实验报告
年级__ xxxx班____________
专业___________xxxxx____ _____
学号____________6315070301XX___________
姓名_____________gllh________________
日期___________2018-5-12 __
实验五聚类算法实现
一、实验目的
1、了解常用聚类算法及其优缺点
2、掌握k-means聚类算法对数据进行聚类分析的基本原理和划分方法
3、利用k-means聚类算法对已知数据集进行聚类分析
实验类型:验证性
计划课间:4学时
二、实验内容
1、利用python的sklearn库函数对给定的数据集进行聚类分析
2、分析k-means算法的实现流程
3、根据算法描述编程实现,调试运行
4、对所给数据集进行验证,得到分析结果
三、实验步骤
1、k-means算法原理
2、k-means算法流程
3、k-means算法实现
4、对已知数据集进行分析
四、实验结果分析
1.利用python的sklearn库函数对给定的数据集进行聚类分析:
其中数据集选取iris鸢尾花数据集
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
def dist(x,y):
return sum(x*y)/(sum(x**2)*sum(y**2))**0.5
def K_means(data=iris.data,k=3,ping=0,maxiter=100):
n, m = data.shape
centers = data[:k,:]
while ping < maxiter:
dis = np.zeros([n,k+1])
for i in range(n):
for j in range(k):
dis[i,j] = dist(data[i,:],centers[j,:])
dis[i,k] = dis[i,:k].argmax()
centers_new = np.zeros([k,m])
for i in range(k):
index = dis[:,k]==i
centers_new[i,:] = np.mean(data[index,:],axis=0) if np.all(centers==centers_new):
break
centers = centers_new
ping += 1
return dis
if __name__ == '__main__':
res = K_means()
print(res)
(1)、首先求出样本之间的余弦相似度:
sum(x*y)/(sum(x**2)*sum(y**2))**0.5
(2)、设置k类别数为3,最大迭代次数为100
K_means(data=iris.data,k=3,ping=0,maxiter=100):
(3)、设置样本个数、属性个数并初始化类中心
n, m = data.shape
centers = data[:k,:]
(4)、求各样本至各类中心的距离
for i in range(n):
for j in range(k):
dis[i,j] = dist(data[i,:],centers[j,:])
dis[i,k] = dis[i,:k].argmax()
(5)、求新类中心:各类样本均值作为新类中心
for i in range(k):
index = dis[:,k]==i
centers_new[i,:] = np.mean(data[index,:],axis=0) 实验结果:
2.使用自己的数据集进行聚类分析并进行可视化:# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from sklearn.cluster import Birch
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
df = pd.read_csv("fa.csv",encoding = "utf-8")
X = df[['height','weight']].values
clf = KMeans(n_clusters=2)
y_pred = clf.fit_predict(X)
print(clf)
print(y_pred)
x = [n[0] for n in X]
print (x)
y = [n[1] for n in X]
print (y)
plt.scatter(x, y, c=y_pred, marker='o')
plt.title("K-means Boy/Girl-height-weight Data")
plt.xlabel("Height/cm")
plt.ylabel("Weight/kg")
plt.legend(["Position"])
plt.show()
本数据集使用男性女性身高体重数据集,k值为2,就是讲数据聚合为2类,看身高体重分布结果。
从此次实验看出,聚类数据集必须可以分类才能使用此算法,否则就会产生如下结果:
此数据集为UCI香水数据,无法进行聚类分析
五、实验心得
通过这次实验,使用K-means算法对数据集进行聚类分析,了解了算法的过程,首先选择K个点作为初始质心,之后进行重复并将每个点指派到最近的质心,形成K个簇后重新计算每个簇的质心直到簇不发生变化或达到最大迭代次数为止,首先我们要直到有多少种分类,选择K个初始质心,其中K是指定的参数,即所期望的簇的个数。
这样做的前提是我们已经知道数据集中包含多少个簇,但很多情况下,我们并不知道数据的分布情况,实际上聚类就是我们发现数据分布的一种手段,之后质心的选取也非常重要,选择适当的初始质心是基本kmeans算法的关键,一般是随机的选取初始质心,通过这次实验,实现了调用sklearn进行数据集的聚类算法,对以后工作学习都有所帮助。
六、注意事项
1、距离函数的选择
2、评价函数的计算
3、噪声数据的处理
4、数据集仍然可以选取分类算法所用数据集(手写体数字,雉尾花。
或者自带的其他聚类数据集)。