基于sklearn 对 IRIS 数据集分类
关于聚类
聚类(Clustering)是一种无监督学习(unsupervised learning),简单地说就是把相似的对象归到同一簇中。簇内的对象越相似,聚类的效果越好。
关于 K-Means
K-Means算法是最为经典的基于划分的聚簇方法,是十大经典数据挖掘算法之一。简单的说K-Means就是在没有任何监督信号的情况下将数据分为K份的一种方法。聚类算法就是无监督学习中最常见的一种,给定一组数据,需要聚类算法去挖掘数据中的隐含信息。聚类算法的应用很广:顾客行为聚类,google新闻聚类等。
具体的算法步骤如下:
- 随机选择K个中心点
- 把每个数据点分配到离它最近的中心点;
- 重新计算每类中的点到该类中心点距离的平均值
- 分配每个数据到它最近的中心点;
- 重复步骤3和4,直到所有的观测值不再被分配或是达到最大的迭代次数(R把10次作为默认迭代次数)。
sklearn 实现
from sklearn import datasets
from sklearn.cluster import KMeans
import numpy as np
def mode(a):
```求众数子函数```
counts = np.bincount(a)
return np.argmax(counts)
def calc_acc(y_p, y):
```计算准确率子函数```
return sum(y_p==y)/y.shape[0]
if __name__ == '__main__':
iris = datasets.load_iris()
x = iris.get('data')
y = iris.get('target')
# 随机划分训练集和测试集
num = x.shape[0] # 样本总数
ratio = 7/3 # 划分比例,训练集数目:测试集数目
num_test = int(num/(1+ratio)) # 测试集样本数目
num_train = num - num_test # 训练集样本数目
index = np.arange(num) # 产生样本标号
np.random.shuffle(index) # 洗牌
x_test = x[index[:num_test],:] # 取出洗牌后前 num_test 作为测试集
y_test = y[index[:num_test]]
x_train = x[index[num_test:],:] # 剩余作为训练集
y_train = y[index[num_test:]]
kmeans = KMeans(n_clusters=3)
kmeans.fit(x_train)
centers = kmeans.cluster_centers_
for i in range(3):
index = y_train == i
p = kmeans.predict(x_train[index,:])
pp = mode(p) # 求实际类别为 i 所对应的类别标号 pp
kmeans.cluster_centers_[i] = centers[pp] # 相应的调整类别标号,以正确预测
y_test_pre = kmeans.predict(x_test)
print("y_test_pre:")
print(y_test_pre)
print("y_test:")
print(y_test)
# 计算分类准确率
acc = calc_acc(y_test_pre, y_test)
print('the accuracy is', acc) # 显示预测准确率
运行结果: