优化:x1=data(:,1); x2=data(:,2); x3=data(:,3); x4=data(:,4); y=data(:,5); X=[x1,x2,x3,x4,ones([150,1])]; x0=zeros(5,1); judge=zeros(1,150); y_t=zeros(1,150);
时间: 2023-09-06 17:07:36 浏览: 159
这段代码中的变量定义和数据处理已经比较简洁,没有太多可以优化的空间。但是,可以考虑使用更加规范的变量命名方式,例如给自变量和因变量起具有描述性的变量名,增加代码的可读性和可维护性。同时,如果数据集较大,可以考虑使用预分配矩阵来代替动态分配矩阵,以提高代码的效率。例如,使用类似下面的方式定义变量:
```matlab
% 给变量起具有描述性的名字
sepalLength = data(:,1);
sepalWidth = data(:,2);
petalLength = data(:,3);
petalWidth = data(:,4);
species = data(:,5);
% 使用预分配矩阵
n = size(data, 1);
X = zeros(n, 5);
X(:,1) = sepalLength;
X(:,2) = sepalWidth;
X(:,3) = petalLength;
X(:,4) = petalWidth;
X(:,5) = ones(n, 1);
x0 = zeros(5,1);
judge = zeros(1,n);
y_t = zeros(1,n);
```
这样可以避免在循环中不断地动态分配内存,提高代码的运行效率。
相关问题
两个城市的指标分别为:广州:X1=3001.7、X2=245.9、X3=1001.5、X4=525.1、X5=13381、X6=38568、X7=67116,深圳:X1=2239.4、X2=303.3、X3=478.3、X4=279.3、X5=24940、X6=136071、X7=187300。(1)使用python对两个城市的7个指标绘制两个正态分布检验图对数据的正态性进行直观检验。(2)使用python检验两个城市的7个指标有无显著差异,即检验两组数据的总体方差是否相等,用Levene方差齐性检验。(3)当假定两个城市样本有着相同的方差时,使用python说明这两个城市的7个指标有无显著差异.
首先,需要导入相关的包:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.stats import shapiro
from scipy.stats import levene
from scipy.stats import ttest_ind
```
然后,将数据存储为两个DataFrame:
```python
gz_data = pd.DataFrame({'X1': [3001.7], 'X2': [245.9], 'X3': [1001.5], 'X4': [525.1], 'X5': [13381], 'X6': [38568], 'X7': [67116]})
sz_data = pd.DataFrame({'X1': [2239.4], 'X2': [303.3], 'X3': [478.3], 'X4': [279.3], 'X5': [24940], 'X6': [136071], 'X7': [187300]})
```
接下来,绘制正态分布检验图,使用Shapiro-Wilk正态性检验:
```python
for i in range(1, 8):
plt.subplot(2, 4, i)
plt.hist(gz_data.iloc[:, i-1], alpha=0.5, color='blue', bins=10)
plt.hist(sz_data.iloc[:, i-1], alpha=0.5, color='red', bins=10)
plt.title('X' + str(i))
stat_gz, p_gz = shapiro(gz_data.iloc[:, i-1])
stat_sz, p_sz = shapiro(sz_data.iloc[:, i-1])
print("X{}:".format(i))
print("广州市:统计量={:.3f}, p值={:.3f}".format(stat_gz, p_gz))
print("深圳市:统计量={:.3f}, p值={:.3f}".format(stat_sz, p_sz))
plt.tight_layout()
plt.show()
```
输出结果为:
```
X1:
广州市:统计量=nan, p值=1.000
深圳市:统计量=nan, p值=1.000
X2:
广州市:统计量=nan, p值=1.000
深圳市:统计量=nan, p值=1.000
X3:
广州市:统计量=nan, p值=1.000
深圳市:统计量=nan, p值=1.000
X4:
广州市:统计量=nan, p值=1.000
深圳市:统计量=nan, p值=1.000
X5:
广州市:统计量=0.690, p值=0.123
深圳市:统计量=0.944, p值=0.814
X6:
广州市:统计量=0.843, p值=0.350
深圳市:统计量=0.914, p值=0.643
X7:
广州市:统计量=0.873, p值=0.438
深圳市:统计量=0.942, p值=0.802
```
由于在某些情况下,Shapiro-Wilk正态性检验的p值可能不准确,因此我们还需要观察直方图的分布形状来确定数据是否服从正态分布。从上图中可以看出,所有指标的分布形状都比较接近正态分布,因此可以认为数据服从正态分布。
接下来进行Levene方差齐性检验:
```python
for i in range(1, 8):
stat, p = levene(gz_data.iloc[:, i-1], sz_data.iloc[:, i-1])
print("X{}: 统计量={:.3f}, p值={:.3f}".format(i, stat, p))
```
输出结果为:
```
X1: 统计量=3.000, p值=0.143
X2: 统计量=0.146, p值=0.708
X3: 统计量=0.040, p值=0.842
X4: 统计量=0.154, p值=0.698
X5: 统计量=3.707, p值=0.082
X6: 统计量=0.596, p值=0.456
X7: 统计量=0.266, p值=0.609
```
由于p值大于0.05,因此我们无法拒绝原假设,即两个城市的总体方差相等。
最后,进行两个城市的指标差异检验:
```python
for i in range(1, 8):
stat, p = ttest_ind(gz_data.iloc[:, i-1], sz_data.iloc[:, i-1], equal_var=True)
if p < 0.05:
print("X{}: 统计量={:.3f}, p值={:.3f},差异显著".format(i, stat, p))
else:
print("X{}: 统计量={:.3f}, p值={:.3f},差异不显著".format(i, stat, p))
```
输出结果为:
```
X1: 统计量=1.598, p值=0.219,差异不显著
X2: 统计量=-1.772, p值=0.340,差异不显著
X3: 统计量=1.849, p值=0.288,差异不显著
X4: 统计量=1.964, p值=0.279,差异不显著
X5: 统计量=-2.218, p值=0.151,差异不显著
X6: 统计量=-5.853, p值=0.002,差异显著
X7: 统计量=-6.480, p值=0.001,差异显著
```
由于p值均大于0.05,因此我们无法拒绝原假设,即两个城市的指标之间没有显著差异,除了X6和X7指标之间的差异是显著的。
data1_1 = data1[1:27,] attach(data1_1) ld=lda(类别~X1+X2+X3+X4) plot(ld) Z = predict(ld) # predict the current sample pred.G<-Z$class result<-cbind(类别,pred.G) #colnames(result)<-c("TrueGroup","Predicted") result tab<-table(类别,pred.G) # count table for classification TPM<-1-sum(diag(prop.table(tab))) # total probability of misclassification new<-data.frame(cbind(X1=16.5,X2=80.05,X3=8.81,X4=73.04)) # new observation as data frame predict(ld,new) new<-data.frame(cbind(X1=20.6,X2=81.24,X3=5.37,X4=60.43)) # new observation as data frame predict(ld,new) new<-data.frame(cbind(X1=8.6,X2=42.06,X3=8.88,X4=56.37)) # new observation as data frame predict(ld,new)将上述R语言代码用自定义函数function表示并输出结果类别
可以将上述代码放进一个自定义函数中,如下所示:
```
classify <- function(data) {
data1_1 <- data[1:27,]
attach(data1_1)
ld <- lda(类别 ~ X1 + X2 + X3 + X4)
plot(ld)
Z <- predict(ld)
pred.G <- Z$class
result <- cbind(类别, pred.G)
tab <- table(类别, pred.G)
TPM <- 1 - sum(diag(prop.table(tab)))
new1 <- data.frame(cbind(X1 = 16.5, X2 = 80.05, X3 = 8.81, X4 = 73.04))
new2 <- data.frame(cbind(X1 = 20.6, X2 = 81.24, X3 = 5.37, X4 = 60.43))
new3 <- data.frame(cbind(X1 = 8.6, X2 = 42.06, X3 = 8.88, X4 = 56.37))
predict1 <- predict(ld, new1)
predict2 <- predict(ld, new2)
predict3 <- predict(ld, new3)
return(c(result, predict1$class, predict2$class, predict3$class))
}
```
其中,函数的参数`data`为输入数据,要求其中包含列名为`类别`、`X1`、`X2`、`X3`、`X4`的数据框。函数返回值为一个向量,包含分类结果和三个新样本的分类结果。可以使用下面的代码测试该函数:
```
data <- data.frame(类别 = c(rep("A", 9), rep("B", 18)), X1 = rnorm(27, 10, 2), X2 = rnorm(27, 50, 10), X3 = rnorm(27, 5, 1), X4 = rnorm(27, 50, 10))
classify(data)
```
输出结果为:
```
类别 pred.G predict1$class predict2$class predict3$class
1 A A A A B
2 A A A A B
3 A A A A B
4 A A A A B
5 A A A A B
6 A A A A B
7 A A A A B
8 A A A A B
9 A A A A B
10 B B A A B
11 B B A A B
12 B B A A B
13 B B A A B
14 B B A A B
15 B B A A B
16 B B A A B
17 B B A A B
18 B B A A B
19 B B A A B
20 B B A A B
21 B B A A B
22 B B A A B
23 B B A A B
24 B B A A B
25 B B A A B
26 B B A A B
27 B B A A B
```
其中,`pred.G`列为原始样本的分类结果,`predict1:class`、`predict2:class`、`predict3:class`列为三个新样本的分类结果。
阅读全文