实验一 多元数据的数学表达
实验目的:
1. 会用R语言求矩阵的逆矩阵、特征根和特征向量
2. 对给定的数据会计算频数、频率和累积频率、并绘制直方图
3. 会用R语言编写进行计量数据频数表分析的程序
实验内容:
1. 用R语言求下面相关系数矩阵的逆矩阵、特征根和特征向量。
2. 某厂对50个计件工人某月份工资进行登记,获得以下数据。按组距为300编制频数表,计算频数、频率和累计频率,并画出直方图。
3. 编制进行计量数据频数表分析的R语言函数。
实验要求:
1. 提交代码(*.R文件)
2. 提交执行结果截图
3. 提交电子版实验报告
执行结果图例
#创建一个矩阵
实验二 单变量线性回归
实验目的:
1. 能够根据给定数据创建单变量线性回归模型
2. 会使用线性回归模型进行预测
3. 会对预测结果进行评价
实验内容:
假设某披萨店的披萨价格和披萨直径之间有下列数据关系:
根据上面的训练数据,预测12英寸的披萨的可能售价。
1.直径为自变量X,价格为因变量y,画出二者的散点图,并给出结论。
2.根据现有的训练数据求线性回归模型,并画出拟合直线。
步骤:
准备训练数据
求线性方程斜率
求线性方程截距
显示线性回归方程
检验线性回归方程
做散点图
画拟合直线
3.预测12英寸披萨的价格。
4.评价模型的准确率,分析模型预测结果。
测试数据:
实验结果图:
备注:该实验数据是自己随便写的的,数据存在一定的错误,效果不是很好是可能情况。
#相关库的导入
library(readxl)
library(mvstats)
#准备训练数据
#数据导入
dia_price <- read_excel("D:自己用项目R语言课程实验二data.xlsx"
, sheet = 1, col_names = T)
test <- read_excel("D:自己用项目R语言课程实验二data.xlsx"
, sheet = 2, col_names = T)
model <- read_excel("D:自己用项目R语言课程实验二data.xlsx"
, sheet = 3, col_names = T)
attach(dia_price)
#画出原始数据的散点图
plot(diameter, price)
#离均差计算函数
lxy <- function(x, y){
n = length(x);
sum(x*y) - sum(x)*sum(y)/n
}
#diameter的离均差平方和
lxy(diameter, diameter)
#price的离均差平方和
lxy(price, price)
#diameter和price的离均差乘积和
lxy(diameter, price)
#使用离均差乘积和计算的相关系数
r = lxy(diameter, price)/sqrt(lxy(diameter, diameter) * lxy(price, price))
r
#下面的是自带的相关性计算函数
cor(diameter, price)
#求线性方程斜率
b = lxy(diameter, price)/lxy(diameter, diameter)
b
#求线性方程截距
a = mean(price) - b*mean(diameter)
a
#显示线性回归方程
fm = lm(formula = price~diameter, data = dia_price)
fm
#coef.sd(fm) 用于偏回归系数
#price = 1.9655 + 0.9763*diameter
#print(fm$coefficients)
#检验线性回归方程
#方差分析
anova(fm)
#回归系数的t检验
summary(fm)
#做散点图
plot(price~diameter, data = dia_price, main = 'Pizza Price vs Diameter')
#画拟合直线
abline(fm)
#使用箱尾图来观测
boxplot(dia_price$price)
#预测12英寸披萨的价格。
a <- data.frame(diameter = 12)
result <- predict(fm, a)
result
detach(dia_price)
attach(test)
#做散点图
t = price~diameter
plot(t, data = dia_price, main = 'Pizza Price vs Diameter')
#画拟合直线
par(new=TRUE)
#画测试数据点
points(t, data = test, col='red', pch=19, main = 'Pizza Price vs Diameter')
abline(fm)
#自定义针对该问题的误差分析函数
#输入:预测结果,真实结果,误差范围(默认为0.3)
#输出:准确度数组
acc <- function(x, y, vRan = 0.3){#默认误差为0.3
#count = 0#记录数据个数
index = 1#y的索引
var = c()
for (vx in x) {
if(vx-vRan <= y[index] && y[index] <= vx+vRan){
var <- append(var, TRUE)
}else{
var <- append(var, FALSE)
}
index = index+1
#count = count+1
}
#result <- c(count,var)
#names(result) <- c('count', 'varieties')
return(var)
}
#准确度计算
#输入:准确度数组
#输出:准确率
acccount <- function(accArr){
count = 0#统计准确元素个数
for (vAcc in accArr) {#遍历准确度数组
if(vAcc){#统计TRUE的个数
count = count + 1
}
}
return(count/length(accArr))
}
#预测test中不同直径对应的价格
result_test <- predict(fm, diameter=test$diameter)
#对数据进行四舍五入,保留一位小数
result_test <- round(result_test, 1)
result_test
#精确度计算
acc_result <- acc(result_test, test$price)
acc_result
pPredict <- acccount(acc_result)
pPredict
#使用箱尾图来观测
boxplot(test$price)
detach(test)
fm2 = lm(formula = price~diameter, data = model)
fm2
#检验线性回归方程
#方差分析
anova(fm2)
#回归系数的t检验
summary(fm2)
#做散点图
plot(price~diameter, data = model, main = 'Pizza Price vs Diameter')
#画拟合直线
abline(fm2)
#预测12英寸披萨的价格。
a <- data.frame(diameter = 12)
result <- predict(fm2, a)
result
#预测test中不同直径对应的价格
result_test2 <- predict(fm2, diameter=test$diameter)
#对数据进行四舍五入,保留一位小数
result_test2 <- round(result_test2, 1)
result_test2
#精确度计算
acc_result2 <- acc(result_test2[1:5], test$price)
acc_result2
pPredict2 <- acccount(acc_result2)
pPredict2
fm3 = lm(formula = price~diameter2, data = model)
fm3
#检验线性回归方程
#方差分析
anova(fm3)
#回归系数的t检验
summary(fm3)
#做散点图
plot(price~diameter2, data = model, main = 'Pizza Price vs Diameter')
#画拟合直线
abline(fm3)
#预测test中不同直径对应的价格
result_test3 <- predict(fm3, diameter2=test$diameter2)
#对数据进行四舍五入,保留一位小数
result_test3 <- round(result_test3, 1)
result_test3
#精确度计算
acc_result3 <- acc(result_test3[1:5], test$price)
acc_result3
pPredict3 <- acccount(acc_result3)
pPredict3
实验三 使用Logistic回归模型对乳腺癌数据分类
实验目的:
- 会使用R语言对给定的数据创建Logistic回归模型
- 会使用R语言对数据进行标准化处理
- 会用逐步变量选择法选择变量并创建模型
实验内容:
乳腺癌数据集存放了数百条检测数据和对应的诊断结果,使用Logistic回归模型对该数据进行分类,并评价模型的准确率。
数据说明:
前9列是特征属性,每个特征都已经转换成了0~10之间的整数,具体含义如下:
- 肿块厚度
- 细胞大小均匀性
- 细胞形状均匀性
- 边缘粘性
- 单一上皮细胞大小
- 裸核
- Bland染色质
- 正常细胞核
- 有丝分裂
第10列是诊断结果,0表示良性,1表示恶性
- 读取数据,显示前10行数据后后10行数据
- 按照8:2的比例分割数据集为训练集和测试集,显示测试集和数据集的维度
- 使用全变量创建逻辑Logistic回归模型,显示模型表达式
- 使用逐步回归法选择合适的变量创建Logistics回归模型,选出最好的模型,显示模型表达式
- 计算并显示Logistic回归模型在训练集和验证集上的准确率
- 分析Logistic回归模型分类结果。
#相关库引用
library(mvstats)
#数据读取
X <- read.csv("D:自己用项目R语言课程实验三breast_cancer.csv")
X <- na.omit(X)#异常值处理
attach(X)
# 读取数据,显示前10行数据后后10行数据
head(X, n = 10)
tail(X, n = 10)
# 按照8:2的比例分割数据集为训练集和测试集,显示测试集和数据集的维度
set.seed(20180808)#设置随机种子
index <- sort(sample(nrow(X), nrow(X)*.8))
train <- X[index,]
test <- X[-index,]
n1 = ncol(train)
n2 = ncol(test)
print(paste("数据集的维度为",as.character(n1)))
print(paste("测试集的维度为",as.character(n2)))
# 使用全变量创建逻辑Logistic回归模型,显示模型表达式
logit.glm <- glm(y~x1+x2+x3+x4+x5+x6+x7+x8+x9, family = binomial, data = train)
summary(logit.glm)
print(paste("p = (exp(-10.07374+0.53667x1-0.02610x2+0.26239x3+0.38038x4+0.06444x5+0.41367x6+0.39594x7+0.26710x8+0.68928x9))",
"/(1 + exp(-10.07374+0.53667x1-0.02610x2+0.26239x3+0.38038x4+0.06444x5+0.41367x6+0.39594x7+0.26710x8+0.68928x9))"))
# 使用逐步回归法选择合适的变量创建Logistics回归模型,选出最好的模型,显示模型表达式
logit.step <- step(logit.glm, direction = "both")
coef.sd(logit.step)
summary(logit.step)
print(paste("p = (exp(-9.9592+0.5326x1+0.2642x3+0.3858x4+0.4200x6+0.3948x7+0.2729x8+0.6826x9))",
"/(1 + exp(-9.9592+0.5326x1+0.2642x3+0.3858x4+0.4200x6+0.3948x7+0.2729x8+0.6826x9))"))
# 计算并显示Logistic回归模型在训练集和验证集上的准确率
#自定义函数编写
#自定义针对该问题的误差分析函数
#输入:预测结果,真实结果
#输出:准确度数组
acc <- function(x, y){
index = 1#y的索引
var = c()
for (vx in x) {
if(vx == y[index] && y[index] == vx){
var <- append(var, TRUE)
}else{
var <- append(var, FALSE)
}
index = index+1
}
return(var)
}
#准确度计算
#输入:准确度数组
#输出:准确率
acccount <- function(accArr){
count = 0#统计准确元素个数
for (vAcc in accArr) {#遍历准确度数组
if(vAcc){#统计TRUE的个数
count = count + 1
}
}
return(count/length(accArr))
}
#根据指定模型在指定数据集上进行预测的准确率
#输入:模型,数据集,预测阈值
#输出:模型预测准确率
pPredict <- function(fm, data, fac){
p <- predict(fm, newdata = data, type = "response")
p <- exp(p)/(1+exp(p))#计算因变量的值
data$y_predicted=1*(p > fac)#给train增加一列,也就是对y的预测,当p>0.5时,预测值为1
#精确度计算
acc_result <- acc(data$y_predicted, data$y) #计算两者的
pPredict <- acccount(acc_result)
pPredict #模型预测准确率
}
fac = 0.7
# p1 <- predict(logit.step, type = "response")
# p1 <- exp(p1)/(1+exp(p1))#计算因变量的值
# train$y_predicted=1*(p1 > fac)#给train增加一列,也就是对y的预测,当p>0.5时,预测值为1
# #精确度计算
# acc_result <- acc(train$y_predicted, train$y)
# # acc_result
# pPredict <- acccount(acc_result)
# pPredict
#训练集的准确度
a1 <- pPredict(logit.step, train, fac)
a1
#测试集的准确度
pPredict(logit.step, test, fac)
#预测阈值改进
for(i in seq(0.5,0.9,0.1)){
a2<-pPredict(logit.step, train, i)
if(a1 < a2){ #得到最优预测阈值
fac = i
}
}
#使用最终预测阈值进行预测的结果
pPredict(logit.step, test, fac)
detach(X)
实验四 使用线性判别和距离判别对数据分类
实验目的:
- 会用R语言的线性判别法对数据进行分类
- 会用R语言的距离判别法对数据进行分类
- 会用R语言对数据进行预处理
实验内容:
使用线性判别法和距离判别法法对income_classification.csv的收入水平进行分类。训练集和测试集的比例是7:3,选取适当的特征列,使得针对测试样本的分类准确率在80%以上,对2种分类方法的分类结果进行比较分析。
数据说明:
- 特征列
age:年龄,整数
workclass:工作性质,字符串
education:教育程度,字符串
education_num:受教育年限,整数
maritial_status:婚姻状况,字符串
occupation:职业,字符串
relationship:亲戚关系,字符串
race:种族,字符串
sex:性别,字符串
capital_gain:资本收益,浮点数
capital_loss:资本损失,浮点数
hours_per_week:每周工作小时数,浮点数
native_country:原籍,字符串
- 分类标签列:income
imcome > 50K
imcome ≤ 50K
- 读入数据并显示数据的维度和前6行数据
- 对连续变量年龄进行离散化,并显示前6行数据离散化后的结果
age_bins= [20, 30, 40, 50, 60, 70] - 对属性是字符串的任意特征进行数字编号处理,显示前6行编码后的结果,每个特定的字符串用一个整数来表示,整数序列从0开始增长。
- 对预处理后的数据用线性判别法和距离判别法分类
实验步骤:
1) 选择合适的若干特征字段
2) 按7:3划分训练集和样本集
3) 使用训练集训练一个线性判别分类器
4) 使用测试集计算线性判别分类器的分类准确率
5) 使用训练集训练一个距离判别分类器
6) 使用测试集计算距离判别分类器的分类准确率
5. 分析实验结果
#函数部分
#将不可定量计算的字符串变量转化为可定量计算的数值变量
#输入:某一列
#输出:将这一列的字符串变量转化为从0开始的整数
toTag <- function(da){
values <- table(da)
S <- names(values)#
count <- length(S)#记录字符串个数
for(j in 1:length(da)){
for(i in 1:count){
if (!is.na(da[j]) && !is.na(S[i])){
if(da[j] == S[i]){
da[j] <- i
}
}
}
}
da
}
#分类准确率
#输入:table形式的分类结果
#输出:准确率
groupingAccuracy <- function(tabl){
tabl <- as.matrix(tabl)
s <- sum(tabl) #求出总和
accS <- 0
count <- ncol(tabl) #记录列数
for(i in 1:count){
accS <- as.integer(tabl[i,i])+accS
#t[i][j] t[i,j]
}
accS/s
}
#相关库的导入
library(MASS)
library(ggplot2) #导入包ggplot
# 读入数据并显示数据的维度和前6行数据
X <- read.csv("D:自己用项目R语言课程实验四income_classification.csv")
#X <- na.omit(X)#异常值处理
#with(data,{...})
X <- X[,-3]
rank = ncol(X)
print(paste("数据集的维度为", as.character(rank)))
head(X, 6)
# 对连续变量年龄进行离散化,并显示前6行数据离散化后的结果0
# age_bins= [20, 30, 40, 50, 60, 70]
#查看一下分类结果
table(floor(X$age/10))
X$age = floor(X$age/10)#age代表年龄从age*10到(age+1)*10的人
head(X, 6)
# 对属性是字符串的任意特征进行数字编号处理,显示前6行编码后的结果
# 每个特定的字符串用一个整数来表示,整数序列从0开始增长。
# X$workclass <- toTag(X$workclass)
# table(unclass(X$workclass))
# class(X$workclass)
# levels(X$workclass)
# S2 <- names(table(X$education))
# toTag(X$education)
# S3 <- names(table(X$marital.status))
# S4 <- names(table(X$occupation))
# S5 <- names(table(X$relationship))
# S5 <- names(table(X$race))
# S5 <- names(table(X$sex))
# X <- as.character(X)
# X <- as.numeric(X)
#字符串变量打标签
X$workclass <- unclass(X$workclass)
X$education <- unclass(X$education)
X$marital.status <- unclass(X$marital.status)
X$occupation <- unclass(X$occupation)
X$relationship <- unclass(X$relationship)
X$race <- unclass(X$race)
X$sex <- unclass(X$sex)
X$native.country <- unclass(X$native.country)
X$income <- unclass(X$income)
#标准化处理
X<-apply(X, 2, as.numeric)
Y = scale(X)
# Y <- X
head(Y, n=6)
# 对预处理后的数据用线性判别法和距离判别法分类
# 1) 选择合适的若干特征字段
# 由于不能直接通过课余知识直接筛选出可能特征,直接按全部特征处理
# 2) 按7:3划分训练集和样本集
set.seed(180512133)#设置随机种子
index <- sort(sample(nrow(Y), nrow(X)*.7))
train <- Y[index,]
test <- Y[-index,]
# 3) 使用训练集训练一个线性判别分类器
# ggplot(data = Y , aes( shape = Group ,color = Group))
# 分类标签
grp = train[,14]
# text(Y,G)
# newG = Z$class
# cbind(grp, Z$x, newG)
# tab = table(grp,newG)
# sum(diag(prop.table(tab)))
ld = lda(train[1:nrow(train),1:13], grp)
# 4) 使用测试集计算线性判别分类器的分类准确率
Z = predict(ld, newdata = test[1:nrow(test),1:13])
t = table(test[,14], Z$class)
groupingAccuracy(t)
# 5) 使用训练集训练一个距离判别分类器
grp = train[,14]
qd = qda(train[1:nrow(train),1:13], grp)
# 6) 使用测试集计算距离判别分类器的分类准确率
Z = predict(qd, newdata = test[1:nrow(test),1:13])
t = table(test[,14], Z$class)
groupingAccuracy(t)
# 分析实验结果
# 使用全变量创建逻辑Logistic回归模型,显示模型表达式
logit.lm <- lm(income~age+workclass+education+education.num+marital.status+occupation+relationship+race+sex
+capital.gain+capital.loss+hours.per.week+native.country, data = as.data.frame(train))
# 使用逐步回归法选择合适的变量创建Logistics回归模型,选出最好的模型,显示模型表达式
logit.step <- step(logit.lm, direction = "both")
summary(logit.step)
# 删除workclass这个特征重新进行判别
# 5) 使用训练集训练一个距离判别分类器
train <- train[,-2]
grp = train[,13]
qd = qda(train[1:nrow(train),1:12], grp)
# 6) 使用测试集计算距离判别分类器的分类准确率
test <- test[,-2]
Z = predict(qd, newdata = test[1:nrow(test),1:12])
t = table(test[,13], Z$class)
groupingAccuracy(t)