【实验目的】
掌握Pthon/R语言进行大数据分析,包括分类任务和聚类任务。掌握kNN、决策树、SVM分类器、kmeans聚类算法的Python或R语言编程方法。
【实验内容】
使用Python或R语言完成大数据分析任务
1、使用kNN、决策树、SVM模型,对iris数据集进行分类
2、使用kmeans聚类算法对iris数据集进行聚类
- Python导入iris数据集方法
from sklearn.datasets import load_iris
iris=load_iris()
attributes=iris.data #获取属性数据
#获取类别数据,这里注意的是已经经过了处理,target里0、1、2分别代表三种类别
target=iris.target
labels=iris.feature_names#获取类别名字
print(labels)
print(attributes)
print(target)
- R语言导入iris数据集
data("iris")
summary(iris)
我选择使用Python语言完成实验。
1.kNN算法
import random
import numpy as np
import operator
from sklearn.datasets import load_iris
iris = load_iris()
attributes=iris.data
target=iris.target
labels = iris.feature_names
f1 = attributes.tolist()
f2 = target.tolist()
i=0
dataset=[]
while i < len(attributes):
f1[i].append(f2[i])
dataset.append(f1[i])
i = i+1
library = []
n = int(len(f1)*0.3)
samples = random.sample(f1, n)
for x in dataset:
if x not in samples:
library.append(x);
def createDataSet():
#四组二维特征
group = np.array(library)
#四组特征的标签
labels = f2
return group, labels
def classify0(inX, dataSet, labels, k):
'''
:param inX: 测试样本(arr)
:param dataSet: 训练数据集(arr)
:param labels: 类别(list)
:param k:(int)
:return: 类别
'''
#计算距离
dataSetSize = dataSet.shape[0] # 样本数量
diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet #tile(inX{数组},(dataSetSize{倍数},1{竖向})):将数组(inX)竖向(1)复制dataSetSize倍
sqDiffMat = diffMat ** 2 #先求平方
sqDistances = sqDiffMat.sum(axis=1) #再求平方和
distances = sqDistances ** 0.5 #开根号,欧式距离
sortedDistIndicies = distances.argsort() #距离从小到大排序的索引
classCount = {
}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]] #用索引得到相应的类别
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
return max(classCount, key=lambda k: classCount[k]) # 返回频数最大的类别
if __name__ == '__main__':
#创建数据集
group, labels = createDataSet()
#测试集
i=0;
while i<len(samples):
test_class = classify0(samples[i], group, labels, 3)
print("测试用例:",samples[i],"所属类别: ",test_class)
i+=1
#打印分类结果
2.决策树算法
# tree.py
import copy
import random
from sklearn.datasets import load_iris
# 找到出现次数最多的分类名称
import operator
# 计算给定数据集的熵
from math import log
def calShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {
}
# 为所有可能的分类创建字典
for featVec in dataSet:
currentLabel = featVec[-1]
if currentLabel not in labelCounts.keys():
labelCounts[currentLabel] = 0
labelCounts[currentLabel] += 1
shannonEnt = 0.0
for key in labelCounts:
# 计算熵,先求p
prob = float(labelCounts[key]) / numEntries
shannonEnt -= prob * log(prob, 2